3

http://www.cplusplus.com/reference/clibrary/cstdlib/rand/,我读到以下内容: 该算法使用种子生成系列,应该使用 srand 将其初始化为一些独特的值。

种子是什么意思以及 rand() 如何使用种子来生成系列?

4

2 回答 2

7

rand()使用所谓的伪随机数生成器它生成的不是真正的随机数,而是一个看起来足够随机并满足某些统计特性的确定性序列。种子本质上是该序列的起始值;给定相同的种子,PRNG 将始终产生相同的序列。这就是为什么你经常用一些不太确定的东西来播种,例如当前时间(尽管如果你在一个紧密的循环中重新播种 PRNG 或者连续或并行运行足够快的程序,这会失败)。

在大多数情况下,C 中的 PRNG 是一个简单的线性同余生成器。它使用以下等式计算序列中的下一个数字:

在此处输入图像描述

这里的ab是必须小心选择的值,以避免可怕的结果。例如,出于显而易见的原因, 2 对于 a 来说是一个非常非常糟糕的选择c只是将数字减少到一定范围,通常是 2 的幂。种子只提供第 0 个值。

于 2012-07-30T05:28:21.317 回答
2

非常粗略地说,它是这样的:

   int rand() {
       return last_random_val = 
          ((last_random_val * 1103515245) + 12345) & 0x7fffffff);
   }

   void srand(int seed) {
        last_random_val = seed;
   }

并且last_random_val设置为seedwhen you call srand()。因此,对于相同的种子,会生成相同的数字序列。

于 2012-07-30T05:29:08.227 回答