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).
是否允许 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 序列的义务呢?
“新”应该被理解为停止使用当前的伪随机数序列,并开始使用从一开始就具有指定种子特征的伪随机数序列,无论该序列是什么。不要求不同的密钥表征不同的序列,尽管这会影响感知的实现质量。
| 归档时间: |
|
| 查看次数: |
133 次 |
| 最近记录: |