C总是生成相同的随机序列吗?

yro*_*roc 4 c random

我跑了一个叫rand()四次的程序.我使用模数运算符将范围限制为1-6.产生的整数分别为2,5,4和2.我重新编程并获得相同的数字.然后我创建了一个全新的程序,也调用了rand()四次,我仍然得到整数序列2,5,4,2.然后我关闭计算机,重新启动,创建另一个新程序,调用rand()四次,仍然得到序列2,5,4,2.

我理解你需要"种子"RNG所需的基础知识srand(),它在不同的点开始序列,但我只是好奇:忘记播种片刻,是由rand()安装,编译器和/或操作系统生成的序列依赖?例如,以下任何一个会导致不同的顺序:

  • 在我的计算机上卸载并重新安装C编译器
  • 在我的计算机上安装和使用不同的C编译器
  • 使用相同的编译器在别人的计算机上运行程序?
  • 使用不同的编译器(也许是不同的操作系统)在别人的计算机上运行程序?

或者只是使用相同RNG算法的所有C编译器的问题,因此伪随机序列(从头开始)对每个人都是相同的?

oua*_*uah 6

如果你不打电话srand,C说:

C99,7.20.2.2p2)"如果在对srand进行任何调用之前调用了rand,则应该生成与第一次调用srand时种子值为1相同的序列."

因此,如果您的rand函数(在C标准中未指定并允许实现)是一个算法PRNG,如果您不调用,很可能会一次又一次地获得相同的序列srand.

  • @yroc有很多`rand`的实现,所以你不能依赖不同的系统,不同的libc或不同的libc版本实现相同的算法. (2认同)