即使你没有随时间播种(NULL),rand()如何制作随机数?
我理解作为参数传入srand()
的内容将被用作后来发生的对rand()
调用的种子。 通常传入time(NULL)
。
但是如果你只调用srand
一次,然后你就会在循环中连续调用rand
,那么这些数字是如何相互不同的呢? 种子是从time(NULL)
返回的值time(NULL)
…但只使用一个特定的返回值。 那么如何生成不同的数字?
我对C中的线程一无所知。但是每次使用线程和不同的种子,以便后续调用rand
实际上会返回随机数吗? 我注意到当我将静态数字传递给srand
而不是time(NULL)
, rand
仍然会生成随机数。
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的种子(可能包括真正的随机值)。 尽管可以使用硬件随机数生成器生成更接近真正随机的序列,但伪随机数生成器在实践中对于它们的生成速度和它们的再现性而言是重要的。
该特定实现使用线性同余生成器 。