是否允许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;因此,伪随机数的同序通过对rand的后续调用返回,这是令人困惑的.
额外:我们看到,在MSVC中,srand(0)不具有与srand(1)相同的效果。
发布于 2022-10-25 12:38:35
在这种情况下,“新序列”只是指一个新开始的序列。请看C11§7.22.2.2p2中的下一句:
如果使用相同的种子值调用
srand,则将重复伪随机数序列。
这意味着srand(10);后面跟着srand(10);创建了两个保证相同的新序列,所以在这个上下文中,new并不意味着“唯一”。
没有什么能阻止srand(0)和srand(1)成为相同的序列。
发布于 2022-10-25 12:22:25
是否允许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");
}
}我期望该函数的执行将打印“相等”,更普遍的是,在第一个srand()之后生成的任意数量的PRN将等于在第二个之后生成的相同数量的PRN。那么,在什么意义上,第二个srand()调用履行了为新的PRN序列使用指定密钥的义务?
“新”应从停止使用当前伪随机数序列的意义上来理解,并从一开始就开始使用以指定种子为特征的序列,而不管是哪个序列。没有要求不同的键描述不同的序列,尽管这会影响实现的感知质量。
https://stackoverflow.com/questions/74193216
复制相似问题