【问题标题】:Does C always generate the same random sequence?C 是否总是生成相同的随机序列?
【发布时间】:2015-11-23 10:52:15
【问题描述】:

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

我了解使用srand()“播种”RNG 所需的基本知识,它在不同的点开始序列,但我只是好奇:暂时忘记播种,是由@987654327 生成的序列@ 安装、编译器和/或操作系统相关?例如,以下任何一项是否会导致不同的序列:

  • 在我的计算机上卸载并重新安装 C 编译器
  • 在我的计算机上安装和使用不同的 C 编译器
  • 在其他人的计算机上使用相同的编译器运行程序?
  • 在其他人的计算机上使用不同的编译器(可能还有不同的操作系统)运行程序?

还是只是所有 C 编译器都使用相同的 RNG 算法,所以每个人的伪随机序列(从头开始)都是一样的?

【问题讨论】:

  • 为什么不直接咨询C standard
  • @Olaf 因为我的问题没有具体直接地由规范解决,因此很难推断出答案——尤其是对于初学者而言。也因为这个网站上至少有一些善良的人理解初学者并愿意提供帮助。
  • 我发布的标准链接完全回答了。请继续阅读 srand 关于可重复性的内容。至于生成相同的序列:标准是否强制执行特定的算法?请注意,链接不仅仅是一个规范,而是国际标准(嗯,最终草案,但没有显着差异;标准是废话)。

标签: c random


【解决方案1】:

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

C99, 7.20.2.2p2) “如果在调用 srand 之前调用了 rand,则应生成与第一次调用 srand 时相同的序列,种子值为 1。”

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

【讨论】:

  • 但这并不能回答“2、5、4、2”序列来自何处的问题。 (为什么正好是 2、5、4、2?)
  • @idmean 我认为我们对他的问题的理解不同
  • 2、5、4、2 序列来自使用的特定 rand() 算法,种子 1 被用于将值限制为 1、6 的任何算法修改。为此对于特定的编译器/版本,对于种子 1,序列将始终相同。对于不同的编译器/版本,可能使用不同的算法或起始值,因此序列可能完全不同。
  • @yroc rand 的实现有很多,所以你不能依赖不同的系统、不同的 libc 或不同的 libc 版本实现相同的算法。
【解决方案2】:

当您说“运行程序四次”时,听起来您只会为每个种子获得一个 rand() 值,这不是一个随机序列。要获得随机序列,您需要在同一程序运行中调用一次srand() 和多次rand()。如果您需要跨程序执行的随机序列,则必须使用 /dev/random 之类的东西。

【讨论】:

  • 我没说我跑了四次程序。我说我运行了一个名为 rand() 的程序四次。
  • 是的,那里的英语有点模棱两可。在这种情况下,它可能是您在 srand() 中使用的值。
【解决方案3】:

暂时忘记播种,rand() 安装、编译器和/或操作系统生成的序列是否依赖于操作系统?

这取决于特定的库实现,它可能是编译器安装的一部分或单独安装。不同的库实现可能给出不同的序列。我希望两个不同系统上的相同库实现给出相同的值序列,但这是假设它不使用本地系统信息作为 PRNG 算法的一部分。

唯一的要求是对于相同的种子值,序列始终相同,并且如果在没有事先调用 srand 的情况下调用 rand,它的行为就像使用种子调用 srand1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    相关资源
    最近更新 更多