srand(0)和srand(1)给出了同样的结果。srand(2)、srand(3)等给出了不同的结果。
为什么seed = 0和seed = 1产生相同的随机序列?
在手册页找不到解释。只是如果没有提供种子,则使用seed = 1。
谢谢。
发布于 2014-12-09 18:49:47
在srandom_r的glibc源(别名为srand)中,line 179:
/* We must make sure the seed is not 0. Take arbitrarily 1 in this case. */
if (seed == 0)
seed = 1;基本上这只是一个武断的决定。
发布于 2014-12-09 18:52:48
取决于编译器!
srand(0);
int a=rand(),b=rand();
srand(1);
int c=rand(),d=rand();2005年“维也纳公约”结果:
a 0x00000026 int
b 0x00001e27 int
c 0x00000029 int
d 0x00004823 int发布于 2014-12-09 18:54:59
这是一个依赖于实现的行为。
例如,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。
https://stackoverflow.com/questions/27386470
复制相似问题