2012-07-30 60 views
3

http://www.cplusplus.com/reference/clibrary/cstdlib/rand/处,我读了以下内容:该算法使用种子来生成系列,应使用srand将其初始化为某个独特的值。了解rand()操作

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

+0

rand()使用的随机数生成器通常不是很好,你必须弄清楚如何将它的输出转换成你自己想要的分布。 C++ 11在其''标头中提供了一个更好的库。 – bames53 2012-07-30 05:52:15

回答

2

非常好听的,它是这样的:

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

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

当你骂srand()last_random_val设置为seed。因此,对于相同的种子,生成相同的数字序列。

+0

0x7fffffff是什么意思? – Programmer 2012-07-30 05:32:40

+0

这是一个用于绑定结果的掩码,因此不会生成负数。 – perreal 2012-07-30 05:33:13

+0

@编程器:获得编号的31个LSB位。 – SuperSaiyan 2012-07-30 05:33:40

7

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

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

​​

一个b这里是必须谨慎选择,避免horrible results值。例如,由于显而易见的原因,对于a来说2是非常不好的选择。 c只是将数量减少到一定的范围,并且通常是2的幂。种子只提供第0个值。

+0

给你一个向上箭头:) – Programmer 2012-07-30 05:48:27