为什么伪随机函数不直接将种子作为参数?

时间:2016-04-03 00:03:00

标签: c random

生成随机数时,人们首先调用srand(int seed)来生成种子,然后调用rand(void)

我的问题是为什么不直接使用单个函数rand(int seed)

C标准有引用,我不明白,说

该实现应该表现得好像没有库函数调用srand函数。

我不确定这是否与此声明有关。

该标准还给出了一个示例实现,我不明白使用静态变量的原因:

static unsigned long int next = 1;
int rand(void) // RAND_MAX assumed to be 32767
{
    next = next * 1103515245 + 12345;
    return (unsigned int)(next/65536) % 32768;
}
void srand(unsigned int seed)
{
    next = seed;
}

1 个答案:

答案 0 :(得分:3)

每次拨打srand时,都不应该致电rand。事实上,这是一个非常糟糕的主意,因为同一个种子每次都会给你相同的序列:你最终会产生一个恒定的值。

当您想要开始生成新的随机值序列时,应调用

srand。在典型的情况下,它只是在程序开始时的一次。

从那时起,对rand的每次调用都将返回序列中的下一个数字。这就是为什么这里有一个静态变量的原因:rand可以拾取之前离开的位置并生成下一个数字。