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

Ein*_*rji 19 c c++ random std

我理解该rand()函数基于给定的种子生成伪随机数,并且在给定平台上它将始终从同一种子生成相同的数字序列,我想知道它为什么它给出不同的序列跨平台使用相同的库?即如何rand()实施?

Kid*_*ris 21

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

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

您的编译器可以选择从哪里获取库,因此您可能在同一系统上为不同的编译器提供不同版本的标准库.重点保持不变:规范保证了可用的功能和功能; 不是他们怎么做的


dar*_*rak 7

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()是的一部分,<cstdlib>这是C标准库的更多或更少的副本,新的图书馆会为您提供更多的灵活性和标准序列生成器,如果你有一个新的足够的C++编译器,并且不依赖于C - C++的互操作性.