srand(0)
和srand(1)
会给出相同的结果。 srand(2)
,srand(3)
等会给出不同的结果。
seed = 0
和seed = 1
产生相同随机序列的原因是什么?
无法在手册页中找到解释。只有在未提供种子的情况下,才会使用seed = 1
。
感谢。
答案 0 :(得分:11)
在srandom_r
(别名为srand
)的glibc来源中,line 179:
/* We must make sure the seed is not 0. Take arbitrarily 1 in this case. */
if (seed == 0)
seed = 1;
它基本上只是一个武断的决定。
答案 1 :(得分:1)
取决于编译器!
srand(0);
int a=rand(),b=rand();
srand(1);
int c=rand(),d=rand();
VC 2005结果:
a 0x00000026 int
b 0x00001e27 int
c 0x00000029 int
d 0x00004823 int
答案 2 :(得分:1)
这是依赖于实现的行为。
例如,POSIX.1-2001给出了以下rand()和srand()实现的示例
static unsigned long next = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}
void mysrand(unsigned seed) {
next = seed;
}
现在,如果你使用这个实现,你最终会得到:
0
16838
分别为srand(0)
和srand(1)
。
编号: http://linux.die.net/man/3/rand
之前我遇到了一个非常类似的问题,其中rand()
在不同平台上为同一种子产生了不同的序列。经验教训,可移植代码应该实现自己的PRNG。
答案 3 :(得分:-1)
函数srand()用于通过传递参数种子来初始化伪随机数生成器。
因此,如果将种子设置为1,则将生成器重新初始化为其初始值。然后它会在调用rand和srand之前产生结果。
所以srand(1)实际上代表结果srand(0)。