C++ C+中的函数srand+;

C++ C+中的函数srand+;,c++,random,C++,Random,此代码 #include <stdio.h> #include <stdlib.h> #include <time.h> int main () { printf ("First number: %d\n", rand() % 100); srand ( time(NULL) ); printf ("Random number: %d\n", rand() % 100); srand ( 1 ); printf ("A

此代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main ()
{
    printf ("First number: %d\n", rand() % 100);
    srand ( time(NULL) );
    printf ("Random number: %d\n", rand() % 100);
    srand ( 1 );
    printf ("Again the first number: %d\n", rand() %100);

    return 0;
}
还有以下规则:

使用同一种子进行两次不同的初始化,指示伪随机生成器为两种情况下的后续rand调用生成相同的连续结果


我理解这些词,但我就是不理解方法本身。为什么它又回来了?它是随机的还是必须根据此代码在每种情况下返回相同的结果?

我认为这可能是一个问题:

如果seed设置为1,则生成器将重新初始化为其初始值,并生成与任何rand或srand调用之前相同的值

如果调用
rand()
而不首先调用
srand()
,则行为就像调用
srand()
时使用
1
作为参数一样

此行为在原始C标准中定义。我手边没有完整的版本,但是OpenGroup的POSIX标准是次好的,因为它们包含了完整的C标准(带有一些扩展):

srand()函数使用该参数作为后续调用rand()返回的新伪随机数序列的种子。如果随后使用相同的种子值调用srand(),则应重复伪随机数序列。如果在调用srand()之前调用了rand(),则生成的序列应与第一次使用种子值1调用srand()时相同


任何给定种子的
rand()
调用的实际结果都是实现定义的,但对于任何种子x,在生成器种子设定后调用n到
rand()
必须返回相同的结果。因此,在您的实现中,在调用
srand(1)
之后,第一次调用
rand()
时,您总是会得到41,第二次调用
rand()
时,您总是会得到相同的结果(无论是什么结果),其他实现可能使用不同的算法产生不同的结果。< < > > >代码> SRand <代码>值>代码> 1代码>程序启动时将生成器复位到初始状态。

< P> C++遵循C++标准,用于<代码> RAND 和<代码> SRAND (参见C++0X的第26.8节):< /P>
rand
函数具有C标准中指定的语义,但实现可能指定特定库函数可以调用
rand

C标准(C99的7.20.2.2)明确规定:

如果在调用
srand
之前调用了
rand
,则应生成与使用种子值1首次调用
srand
时相同的序列

因此,第一次调用
rand
,种子是1。第三次调用时也是1,这就是为什么得到相同的值

第二次调用
rand
,种子是基于当前时间设置的,这就是为什么会得到不同的结果。除非您确实想要相同的序列(例如在测试中),否则重新为随机数生成器设定种子通常不是一个好主意。

srand(3)
允许您从随机数生成器获得可重复的输出。通过这种方式,您可以编写依赖于随机数的程序,但要对它们进行确定性测试。(通常通过使用命令行选项调用带有提供参数的
srand()
,这样就可以使用1、2、3、4、5…作为输入运行100次。)


因此,这是按预期进行的。

这可能是因为在您对rand的初始调用中,随机数生成器尚未设定种子,因此它使用默认值1设定种子。

这使调试更容易。如果您正常运行,请使用srant(time(NULL))。如果程序中存在错误,请不要调用srand()或srand(1),对rand()的调用将得到相同的数字序列。注意:每次调用rand都会生成序列中的下一个数字,但序列始终相同。注2:您只需在应用程序中调用srand()一次。@Martin York:这一点很好。从未从调试的角度考虑过这一点。有道理。
First number: 41
Random number: 13
Again the first number: 41