为什么C ++ stdlib rand()函数为跨平台的相同种子提供不同的值?

时间:2013-02-27 10:14:08

标签: c++ c random std

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

2 个答案:

答案 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 ++互操作性。