19

我知道该rand()函数会根据给定的种子生成伪随机数,并且在给定的平台上,它总是会从同一个种子生成相同的数字序列,我想知道的是为什么它会给出不同的序列跨使用相同库的平台?即如何rand()实施?

4

2 回答 2

21

C++ 标准没有指定用于 rand() 函数的算法。

该功能由在您的系统上编写标准库的人定义:Microsoft 用于 Visual Studio 中包含的标准库,而 GNU 人员则用于与 GCC 一起打包的标准库。

您的编译器正在选择从何处获取其库,因此对于同一系统上的不同编译器,您可能有不同版本的标准库。要点保持不变:规范保证了哪些功能可用以及它们做什么;不是他们是怎么做的。

于 2013-02-27T10:22:11.497 回答
7

rand() 函数应计算范围为 [0, {RAND_MAX}] 的伪随机整数序列,周期至少为 2^32。

rand_r() 函数应计算 [0, {RAND_MAX}] 范围内的伪随机整数序列。({RAND_MAX} 宏的值应至少为 32767。)

如果 rand_r() 以相同的初始值调用种子指向的对象,并且在连续返回和调用 rand_r() 之间未修改该对象,则应生成相同的序列。

srand() 函数将该参数用作新伪随机数序列的种子,这些伪随机数将由后续调用 rand() 返回。如果随后使用相同的种子值调用 srand(),则应重复伪随机数序列。如果在调用 srand() 之前调用了 rand(),则应生成与第一次调用 srand() 时相同的序列,种子值为 1。

rand() 函数应返回序列中的下一个伪随机数。

这就是 IEEE Std 1003.1 C 标准关于rand()函数应该如何表现的内容。它没有说明如何计算序列。换句话说,每个实现者都可以自由选择他们自己版本的伪随机序列生成器。

你的观察表明他们已经利用了这种自由。

我还可能会指出,rand()它的一部分<cstdlib>或多或少是 C 标准库的副本,如果您有足够新的 C++ 编译器并且没有,那么新库将为您提供更多的灵活性和标准序列生成器依赖于 C - C++ 互操作性。

于 2013-02-27T10:26:00.060 回答