有一次,我的老师教我使用 randomize()
和 random()
函数在 C++ Builder 中生成伪随机数。现在我更喜欢在 VS 2012 中工作,但是当我尝试在那里使用这些功能时,它说“找不到标识符”,即使我添加了 #include <stdlib.h>
。经过一段时间的谷歌搜索,我发现还有 rand()
和 srand()
功能。它们之间有什么区别,哪个更好用?
原文由 Sunrise 发布,翻译遵循 CC BY-SA 4.0 许可协议
有一次,我的老师教我使用 randomize()
和 random()
函数在 C++ Builder 中生成伪随机数。现在我更喜欢在 VS 2012 中工作,但是当我尝试在那里使用这些功能时,它说“找不到标识符”,即使我添加了 #include <stdlib.h>
。经过一段时间的谷歌搜索,我发现还有 rand()
和 srand()
功能。它们之间有什么区别,哪个更好用?
原文由 Sunrise 发布,翻译遵循 CC BY-SA 4.0 许可协议
函数 rand()
和 random()
至少从 POSIX.1-2001 开始由 POSIX 定义(并且 randomize()
未标准化)。
在较旧的 rand()
实现上,以及在不同系统上的当前实现上,低阶位的随机性远低于高阶位。
如果可用, random()
不会遇到此问题。
此外,现代版本的 rand()
使用与 random()
相同的随机数生成器。所以 rand()
可能是正确的,但不能保证。
因此,请始终使用 random()
而不是 rand()
。如果 random()
在您的操作系统上不可用,请要求操作系统开发人员提供更新的标准 API 实现(2001 标准现在已经足够老,可以期望任何系统都提供它)。
原文由 Jérôme Pouiller 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.3k 阅读✓ 已解决
4 回答2.9k 阅读
1 回答2.7k 阅读✓ 已解决
3 回答3.5k 阅读
3 回答516 阅读✓ 已解决
randomize()
和random()
不是标准库的一部分。也许您的老师使用这些名称编写了用于您的班级的函数,或者您的意思是random()
和srandom()
是 POSIX 的一部分,在 Windows 上不可用。rand()
和srand()
是标准库的一部分,将由任何符合标准的 C++ 实现提供。您应该避免使用
rand()
和srand()
并使用新的 C++11<random>
库。<random>
被添加为 C++11 标准的一部分(VS2012 确实提供了它)。解释原因的视频:
rand()
被认为是有害的rand()
有时是低质量的 pRNG,不适合需要合理水平的不可预测性的应用程序。<random>
提供各种不同特性的引擎,适用于许多不同的用例。将
rand()
的结果转换为可以直接使用的数字通常依赖于难以阅读且容易出错的代码,而使用<random>
分发版很容易并产生可读的代码。使用
rand()
在给定分布中生成值的常用方法进一步降低了生成数据的质量。%
通常会使数据产生偏差,浮点除法仍然会产生非均匀分布。<random>
发行版质量更高,可读性更强。rand()
依赖于隐藏的全局资源。在其他问题中,这会导致rand()
不是线程安全的。一些实现会保证线程安全,但这不是标准要求的。<random>
提供的引擎将 pRNG 状态封装为具有值语义的对象,从而可以灵活控制状态。srand()
只允许有限范围的种子。<random>
中的引擎可以使用允许最大可能种子数据的种子序列进行初始化。seed_seq
还实现了常见的 pRNG 预热。使用
<random>
的示例: