srand(0)和srand(1)给出相同的结果?

时间:2014-12-09 18:44:22

标签: c random srand

srand(0)srand(1)会给出相同的结果。 srand(2)srand(3)等会给出不同的结果。

seed = 0seed = 1产生相同随机序列的原因是什么?

无法在手册页中找到解释。只有在未提供种子的情况下,才会使用seed = 1

感谢。

4 个答案:

答案 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)。