是否允许 srand(0) 具有与 srand(1) 相同的效果?

Pav*_*kin 2 c random glibc srand language-lawyer

是否允许srand(0)具有与 相同的效果srand(1)

C11,7.22.2.2 srand 函数(添加强调):

srand 函数使用参数作为后续调用 rand 返回的新伪随机数序列的种子。

然而,在 glibc 中srand(0)具有相同的效果srand(1)

  /* We must make sure the seed is not 0.  Take arbitrarily 1 in this case.  */
  if (seed == 0)
    seed = 1;
Run Code Online (Sandbox Code Playgroud)

因此,后续调用会返回相同的伪随机数序列rand,这令人困惑。

额外:我们​​看到在 MSVC 中srand(0)并没有与srand(1).

Joh*_*ger 5

是否允许 srand(0) 具有与 srand(1) 相同的效果?

您从语言规范中引用的文本没有表明其他情况,我也没有任何其他理由不这么认为。您强调“新序列”一词,但这绝不意味着不同的种子必须产生不同的序列。

事实上,您引用的描述决不会以呈现给 的密钥值来限制后续 PRN 序列的新颖性srand()。考虑这个函数,然后:

void rtest(void) {
    srand(42);
    int x1 = rand();
    srand(42);
    int x2 = rand();
    if (x1 == x2) {
        puts("equal");
    } else {
        puts("unequal");
    }
}
Run Code Online (Sandbox Code Playgroud)

我期望该函数的执行打印“等于”,更一般地说,第一个函数之后生成的任意数量的 PRNsrand()将等于第二个函数之后生成的相同数量的 PRN。那么,在什么意义上,第二次srand()调用履行了将指定密钥用于新的PRN 序列的义务呢?

“新”应该被理解为停止使用当前的伪随机数序列,并开始使用从一开始就具有指定种子特征的伪随机数序列,无论序列是什么。不要求不同的密钥表征不同的序列,尽管这会影响感知的实现质量。