首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >srand(0)和srand(1)给出了相同的结果?

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

Stack Overflow用户
提问于 2014-12-09 18:44:21
回答 4查看 1.6K关注 0票数 2

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

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

在手册页找不到解释。只是如果没有提供种子,则使用seed = 1

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-12-09 18:49:47

srandom_r的glibc源(别名为srand)中,line 179

代码语言:javascript
复制
/* We must make sure the seed is not 0.  Take arbitrarily 1 in this case.  */
if (seed == 0)
    seed = 1;

基本上这只是一个武断的决定。

票数 11
EN

Stack Overflow用户

发布于 2014-12-09 18:52:48

取决于编译器!

代码语言:javascript
复制
srand(0);
int a=rand(),b=rand();
srand(1);
int c=rand(),d=rand();

2005年“维也纳公约”结果:

代码语言:javascript
复制
a    0x00000026    int
b    0x00001e27    int
c    0x00000029    int
d    0x00004823    int
票数 1
EN

Stack Overflow用户

发布于 2014-12-09 18:54:59

这是一个依赖于实现的行为。

例如,POSIX.1-2001给出了以下实现rand()和srand()的示例

代码语言:javascript
复制
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;
}

现在,如果您使用此实现,您将得到以下结果:

代码语言:javascript
复制
0
16838

分别用于srand(0)srand(1)

参考文献:http://linux.die.net/man/3/rand

我以前遇到过一个非常类似的问题,rand()在不同的平台上为相同的种子产生了不同的序列。经验教训是,可移植代码应该实现自己的PRNG。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27386470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档