【发布时间】:2011-12-24 08:59:03
【问题描述】:
我刚刚发现srand(1) 将 C(++) 的 PRNG 重置为调用srand 之前的状态(如reference 中所定义)的艰难方式。
但是,种子 0 似乎也这样做,或者在任何调用 srand 之前的状态似乎使用种子 0。
这两个调用有什么区别,或者它们做同样事情的原因是什么?
例如这个代码(execute on Ideone)
#include <stdio.h>
#include <stdlib.h>
int main() {
for (int seed = 0; seed < 4; seed++ ) {
printf( "Seed %d:", seed);
srand( seed );
for(int i = 0; i < 5; i++ )
printf( " %10d", rand() );
printf( "\n");
}
return 0;
}
返回
Seed 0: 1804289383 846930886 1681692777 1714636915 1957747793
Seed 1: 1804289383 846930886 1681692777 1714636915 1957747793
Seed 2: 1505335290 1738766719 190686788 260874575 747983061
Seed 3: 1205554746 483147985 844158168 953350440 612121425
【问题讨论】:
-
非常有趣的问题。据我所知, srand 没有任何“神奇”值,但 rand() 只是简单地初始化为种子 1,因此除非告诉不同的东西,否则从该种子开始。这隐含地意味着如果您调用 srand(1),您将“重置为原始状态”。但是,您发布的输出表明它确实“神奇地重置”为您之前设置的种子 0,而不是 1(顺便说一句。我的实现不这样做)。