在http://www.cplusplus.com/reference/clibrary/cstdlib/rand/,我读到以下内容:该算法使用种子生成序列,应使用srand将其初始化为某个独特的值。
种子是什么意思,rand()如何使用种子来生成系列?
答案 0 :(得分:7)
rand()
使用所谓的pseudo-random number generator。它生成的不是真正的随机数,而是出现的确定性序列,看起来足够随机并满足一些统计特性。种子本质上是该序列的起始值;给定相同的种子,PRNG将始终产生相同的序列。这就是为什么你经常播种不是太确定性的东西,例如当前时间(尽管如果您在紧密循环中重新播种PRNG或者连续或并行地足够快地运行程序,则会失败。)
在大多数情况下,C中的PRNG是一个简单的linear congruential generator。它使用以下等式计算序列中的下一个数字:
a 和 b 这里的值必须谨慎选择以避免horrible results。例如,出于显而易见的原因,2对于 a 来说是一个非常糟糕的选择。 c 只是将数量减少到一定范围,通常是2的幂。种子只提供第0个值。
答案 1 :(得分:2)
非常粗略,它类似于:
int rand() {
return last_random_val =
((last_random_val * 1103515245) + 12345) & 0x7fffffff);
}
void srand(int seed) {
last_random_val = seed;
}
当您致电last_random_val
时,seed
设置为srand()
。因此,对于相同的种子,生成相同的数字序列。