rand()如何随机编号,即使你没有随时间播种(NULL)?

时间:2014-10-16 01:59:36

标签: c function random

我理解作为参数传入srand()的内容将被用作之后发生的对rand()的调用的种子。通常会传入time(NULL)

但是,如果您只调用srand一次,然后在循环中连续调用rand,那么这些数字是如何相互不同的?种子是从time(NULL)返回的值...但只使用了一个特定的返回值。那么如何生成不同的数字?

我对C中的线程一无所知。但srand每次都使用线程和不同的种子,以便随后对rand的调用实际返回随机数?我注意到,当我将静态号码传递给srand而不是time(NULL)时,rand仍然会生成随机数。

1 个答案:

答案 0 :(得分:4)

草案C99标准提供了7.20.2.2 部分功能部分中的示例实现,它可能会清除它的工作方式:

  

示例以下函数定义了rand和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;
}

srand设置静态变量next,然后将其设置为rand中的新值,然后对rand的后续调用将会恢复使用之前的next值。

例如,如果我们使用srand(1),那么当我们调用rand时,序列将如下所示:

next = 1
next = 1                   * 1103515245 + 12345  = 1103527590
next = 1103527590          * 1103515245 + 12345  = 1217759518843121895
next = 1217759518843121895 * 1103515245 + 12345  = 15426401326682203284

正如HostileFork指出的那样,这些数字不是真正随机的,而是Pseudorandom,其中说:

  

也称为确定性随机比特生成器(DRBG),[1]是一个   用于生成其属性的数字序列的算法   近似随机数序列的性质。该   PRNG生成的序列不是真正随机的,因为它是完全的   由一组相对较小的初始值确定,称为   PRNG的种子(可能包括真正的随机值)。虽然   可以使用生成更接近真正随机的序列   硬件随机数发生器,伪随机数发生器   在实践中对于他们的数量生成和他们的速度很重要   再现性。

此特定实现使用Linear congruential generator