理解rand()操作

时间:2012-07-30 05:24:48

标签: c++

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

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

2 个答案:

答案 0 :(得分:7)

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

在大多数情况下,C中的PRNG是一个简单的linear congruential generator。它使用以下等式计算序列中的下一个数字:

enter image description here

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()。因此,对于相同的种子,生成相同的数字序列。