2013-08-22 73 views
2

cplusplus.com reference它指出,当试图生成随机数将较低的数字更容易使用模运算符:生成均匀分布的伪随机数在C++

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 
+4

我解释了一点关于[在这个答案](http://stackoverflow.com/a/7114482/596781)。 –

+0

最简单的替代品就是使用''。 – chris

回答

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%!通常不是一个主要问题,但取决于用例,可能会显示一些奇怪的行为。

+0

谢谢,我现在明白了,如果我们在第二种情况下使用rand()/(RAND_MAX/100)的float分区,该怎么办。这能解决问题吗? –

+0

我还没有运行模拟或做了数学,但我敢肯定,第二种方法是正确的。我认为由于浮动的本质,它可能会有一些有点时髦的行为,并且会稍微慢一点,但看起来它会是一种平坦的分布。如果我错了,有人纠正我! – vroomfondel

+0

非常好的解释。我从未意识到这一点! –