我理解rand()
函数根据给定的种子生成伪随机数,并且在给定平台上它总是从同一种子生成相同的数字序列,我想要的知道为什么它在使用相同库的平台上提供不同的序列?即rand()
如何实施?
答案 0 :(得分:21)
C ++标准没有指定rand()函数使用的算法。
该功能由在您的系统上编写标准库的人定义:Microsoft用于Visual Studio附带的标准库,以及与GCC一起打包的标准库的GNU人员。
您的编译器正在选择从何处获取其库,因此您可能在同一系统上为不同的编译器提供不同版本的标准库。重点保持不变:规范保证了可用的功能和功能;不是他们怎么做的。
答案 1 :(得分:7)
rand()函数应计算一系列伪随机整数 在[0,{RAND_MAX}]范围内,周期至少为2 ^ 32。
rand_r()函数应计算伪随机序列 [0,{RAND_MAX}]范围内的整数。 ({RAND_MAX}的值 宏应至少为32767。)
如果使用相同的对象初始值调用rand_r() 种子指向并且该对象在连续之间不被修改 返回并调用rand_r(),应生成相同的序列。
srand()函数使用参数作为新序列的种子 后续调用rand()返回的伪随机数。如果 然后使用相同的种子值(序列)调用srand() 伪随机数应重复。如果之前调用了rand() 对srand()进行任何调用,生成相同的序列 首次使用种子值1调用srand()时。
rand()函数应返回下一个伪随机数 序列
这就是IEEE Std 1003.1 C标准关于rand()
函数应该如何表现的内容。它没有说明如何计算序列。换句话说,每个实现者都可以自由选择自己版本的伪随机序列生成器。
你的观察表明他们利用了这种自由。
我可能还会指出rand()
是<cstdlib>
的一部分,它或多或少是C标准库的副本,新库将为您提供更大的灵活性和标准序列生成器,如果你有一个足够新的C ++编译器,并且不依赖于C - C ++互操作性。