函数srand在C++中

dat*_*ili 6 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 ("Again the first number: %d\n", rand() %100);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有以下输出:

First number: 41
Random number: 13
Again the first number: 41
Run Code Online (Sandbox Code Playgroud)

还有以下规则:

具有相同种子的两个不同初始化指示伪随机生成器在两种情况下为随后的rand调用生成相同的连续结果.

我理解这些词,但我只是不理解方法本身.为什么它再次回归41?它是随机的还是必须根据此代码在每种情况下返回相同的结果?

Nic*_*ght 7

如果在rand()没有先调用的情况下调用srand(),则行为就像您srand()使用1参数调用一样.

此行为在原始C标准中定义.我没有它的完整副本,但是Open Group的POSIX标准是下一个最好的东西,因为它们包含完整的C标准(带有一些扩展):

http://www.opengroup.org/onlinepubs/000095399/functions/rand.html

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

rand()调用任何给定种子的实际结果是实现定义的,除了对于任何种子x,在生成器的种子设置之后调用n to rand()必须返回相同的结果.因此,在您的实现中,在rand()调用后第一次调用时总是会得到41 srand(1),并且您将始终获得第二次rand()调用的相同结果(无论它是什么),其他实现可能使用产生不同结果的不同算法.


pax*_*blo 7

C++标准遵循C标准randsrand(参见C++ 0x第26.8节):

rand函数具有C标准中指定的语义,但实现可以指定特定的库函数可以调用rand.

C标准(C99的7.20.2.2)非常明确地说:

如果rand在进行任何调用之前调用srand,则应生成与srand第一次调用种子值为1 时相同的序列.

所以你第一次打电话时rand,种子是1.你第三次调用它也是1,这就是为什么你得到相同的值.

您第二次调用时rand,已根据当前时间设置种子,这就是您获得不同结果的原因.重新种子随机数生成器通常不是一个好主意,除非你真的想要相同的序列(例如在测试中).