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