【问题标题】:Is the sequence of random numbers generated by rand, in C, guaranteed to always be the same, for the same seed? [duplicate]rand 在 C 中生成的随机数序列是否保证对于相同的种子始终相同? [复制]
【发布时间】:2016-09-20 06:40:17
【问题描述】:

我只是想知道rand (http://www.cplusplus.com/reference/cstdlib/rand/) 函数在不同上运行时是否会生成相同的随机数序列,同时使用相同的种子 > libc 实现,甚至不同的编译器和操作系统(win、linux)。

我使用各种编译器(g++4.8、g++5.1 和 clang)做了一些测试,似乎答案是肯定的,但是我没有找到任何“官方”提及C的随机数生成中使用的PRNG算法(http://pubs.opengroup.org/onlinepubs/009604599/functions/rand.html),或者这些是否应该在标准中提及......

【问题讨论】:

  • 来自您发布的链接 (posix):If srand() is then called with the same seed value, the sequence of pseudo-random numbers shall be repeated.。 C11, §7.22.2.2 有相同的措辞。
  • 我怀疑你已经比较了同一个生成器的三个实现,其中两个(g++ 的)是相同的。
  • @Lundin 这两个讨论了如何跨平台获得一致的结果,但没有直接讨论rand 是否有标准实现。
  • @pjs 这不是一回事吗?后者导致前者。
  • @P.P.这只是说单个 libc 实现必须在对 seed 的调用之间保持一致,而不是不同的实现必须都产生相同的序列。此外,如果这是这个意思,那么标准还必须提供精确的算法来生成“标准序列”,以便人们可以编写符合要求的实现,否则请求是不合理的。

标签: c random


【解决方案1】:

标准中不保证会生成什么:

来自标准:

不保证随机序列的质量 已生成,并且已知某些实现会生成具有以下内容的序列 令人痛苦的非随机低位。具有特定应用 需求应使用已知足以满足 他们的需求。

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

【讨论】:

    【解决方案2】:

    甚至没有指定RAND_MAX 在 C 实现中具有给定值,除非它必须 >= 32767。因此,一个实现上的rand() 可以返回与另一个实现不同的值范围,从而返回不同的序列。

    rand 函数在 范围 0 到 RAND_MAX。 C11dr §7.22.2.1 2

    RAND_MAX 宏的值应至少为 32767。C11dr §7.22.2.1 5

    RAND_MAX 扩展为整数常量表达式,该表达式是 rand 函数 §7.22 3 返回的最大值

    即使使用相同的RAND_MAX,请注意@Servé Laurijssen 答案:来自rand() 的值序列可能不同。


    注意:暗示RAND_MAX <= INT_MAX

    【讨论】:

      【解决方案3】:

      根据https://stackoverflow.com/a/15500754/1994390,答案是否定的。不同的实现无法保证。

      【讨论】:

        猜你喜欢
        • 2013-04-05
        • 1970-01-01
        • 2016-06-10
        • 2015-11-23
        • 1970-01-01
        • 2021-12-26
        • 2020-10-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多