在C ++中生成均匀分布的伪随机数

时间:2013-08-22 23:47:37

标签: c++ random

cplusplus.com reference中,它表明,在尝试生成随机数时使用模运算符会降低数字的可能性:

random_var = rand() % 100 + 1; //this will generate numbers between 1-100

为什么较低的数字更有可能?如果他们是,为什么我们不使用下面的代码:

random_var = rand()/(RAND_MAX/100) + 1; //also will generate those, more uniform I guess

1 个答案:

答案 0 :(得分:5)

让我们说RAND_MAX是150.(显然它实际上不是。)而且我们想要0-99之间的数字。然后我们做rand() % 100。凉。

问题是,如果RAND()返回一个大于100的数字怎么办?我们取102. 102 % 100 = 22 % 100 = 2。因此,2/150有机会获得给定算法的2。但数量超过50?我们只有1/150的机会获得它。 RAND_MAX越高,问题就越小,但仍然存在问题。

请注意,如果RAND_MAX可以被你想要“调制”它的数字整除,那么所有数字都是同等可能的。即如果RAND_MAX是200而不是150.希望这有帮助!

编辑:实际数学。

RAND_MAX保证至少为32767.如果我们想要一个0-99的范围,我们可以RAND() % 100。然后,0到67之间的数字将出现328次可能的次数,而68-99将仅出现327次。前68个数字的概率为1.0010071%,其余数字仅为0.9979553%。我们希望他们都是1%!通常不是主要问题,但取决于用例,可能会显示一些奇怪的行为。