我理解作为参数传入srand()
的内容将被用作之后发生的对rand()
的调用的种子。通常会传入time(NULL)
。
但是,如果您只调用srand
一次,然后在循环中连续调用rand
,那么这些数字是如何相互不同的?种子是从time(NULL)
返回的值...但只使用了一个特定的返回值。那么如何生成不同的数字?
我对C中的线程一无所知。但srand
每次都使用线程和不同的种子,以便随后对rand
的调用实际返回随机数?我注意到,当我将静态号码传递给srand
而不是time(NULL)
时,rand
仍然会生成随机数。
答案 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。