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

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

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

该function由在您的系统上编写标准库的人定义:Microsoft用于Visual Studio附带的标准库,以及用于GCC打包的标准库的GNU人员。

您的编译器正在选择从何处获取其库,因此您可能在同一系统上为不同的编译器提供不同版本的标准库。 重点仍然是:规范保证了可用的function和它们的function; 不是他们怎么做的。

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

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

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

srand()函数使用该参数作为后续调用rand()返回的新伪随机数序列的种子。 如果随后使用相同的种子值调用srand(),则应重复伪随机数序列。 如果在对srand()进行任何调用之前调用rand(),则应生成与首次调用种子值为1的srand()时相同的序列。

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

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

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

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