stdlib的rand()总是给出相同的序列吗?

我非常希望能够重复生成相同的伪随机数据集,特别是在调整实验代码时。 通过观察我会说rand()似乎每次都给出相同的数字序列*。

是否可以保证在同一台机器/不同机器/不同架构上重复执行?

*明显对于同一种子。

是的,考虑到该计划的相同环境。 根据C标准§7.20.2.2/ 2,

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

当然,这假设它使用相同的实现细节(即相同的机器,相同的执行期间的库)。 C标准没有强制要求标准的随机数生成算法,因此,如果使用不同的C标准库运行程序,可能会得到不同的随机数序列。

如果您需要具有给定种子的可移植且保证随机数序列,请参阅跨平台的一致伪随机数问题。

保证为传递给srand()的相同种子提供相同的序列 – 但仅限于单次执行程序的持续时间 。 通常,如果实现在行为上有选择,则没有特定要求该选择在后续执行中保持相同。

它将符合实现在每个程序启动时选择“主种子”,并使用它来以每次程序启动时不同的方式扰乱伪随机数生成器。

如果您希望获得更多的确定性,则应在程序中实现具有特定参数的PRNG。

没有。

C标准说:

如果随后使用相同的种子值调用srand,则应重复伪随机数序列。

但是它没有说明伪随机数的实际序列是什么 – 所以它在不同的实现中是不同的。

唯一的保证是rand()将为给定的实现给出给定种子的相同序列号。 不能保证不同机器或不同架构的顺序是相同的 – 而且几乎肯定不会。

如果您需要使用完全相同的伪随机数集进行实验,您可以做的一件事是使用srand生成一长串随机数并将它们写入文件/数据库。 然后,编写一个便携式“随机数生成器”函数,该函数从该文件顺序返回值。 这样,无论平台, srand实现或种子值如何,您都可以放心使用相同的输入数据。

当切换到不同的机器/运行时/无论你运气不好。 drand48系列function还有另一种选择。 这些被规范化以在所有机器上使用相同的算法。

如果你在UNIX / Linux环境中,你可以在你的手册页上看到drand48()srand48( ),如果你不是,你可以看到C语言的在线手册 。 原型可以在/usr/include/stdlib.h找到。 第一个使用模拟中经常使用的线性同余方法。

如果你为srand48()提供相同的种子,即srand48(2),然后将dran48()放入for循环,那么每次序列都是相同的。 即

 include stdio.h include stdlib.h double drand48(); int main(void){ int i; double rn; srand48(2); for(i=0; i<10; i++){ randNum = drand48(); printf("%.6l\n", randNum); return 0; }