首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >srand(1)和srand(0)有什么区别

srand(1)和srand(0)有什么区别
EN

Stack Overflow用户
提问于 2011-11-08 19:16:40
回答 7查看 12K关注 0票数 18

我刚刚发现srand(1)将C(++)的PRNG重置为调用srand之前的状态(如reference中所定义)。但是,种子0似乎做了同样的事情,或者调用srand之前的状态似乎使用了种子0。这两个调用之间有什么区别,或者它们做同样的事情的原因是什么?

例如,下面的代码(execute on Ideone)

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

返回

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

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-11-08 19:23:38

它可能是一个实现细节。标准规定随机种子1是特殊的,并且您的特定随机生成器算法的内部寄存器可能是零初始化的,从而导致种子(0)和种子(1)的随机序列相同。我甚至敢打赌,srand()实现的第一行代码如下:

代码语言:javascript
复制
if ( seed == 1 ) seed = 0;

强制执行符合标准的行为。

通常,rand()和srand()的随机数生成器不需要为不同的种子提供不同的序列,而是为相同的种子提供相同的序列。因此,不依赖于不同的种子生成不同的随机序列,你应该没问题。如果没有,欢迎来到特定于实现的乐趣。

票数 12
EN

Stack Overflow用户

发布于 2011-11-08 19:44:17

glibc如何做到这一点:

around line 181 of glibc/stdlib/random_r.c,内部函数__srandom_r

/*我们必须确保种子不是0。在这种情况下,任意取1。*/ if (seed == 0) seed = 1;

但是glibc就是这么做的。这取决于C标准库的实现。

票数 19
EN

Stack Overflow用户

发布于 2011-11-08 19:23:02

C和C++标准都没有详细说明rand()srand()的实现细节。细节几乎完全由实现者决定。C标准要求:

如果随后使用相同的种子值调用srand,则应重复伪随机数序列。如果在调用srand之前调用rand,则应生成与首次调用srand时相同的序列,种子值为1。

但它不包含任何要求不同的种子必须产生不同的序列。显然,在您的系统中,0和1的种子具有相同的效果。我猜这是为了向后兼容某些软件,这些软件期望srand(0)将PRNG重置为其初始状态。

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

https://stackoverflow.com/questions/8049556

复制
相关文章

相似问题

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