在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
答案 0 :(得分:5)
让我们说RAND_MAX是150.(显然它实际上不是。)而且我们想要0-99之间的数字。然后我们做rand() % 100
。凉。
问题是,如果RAND()返回一个大于100的数字怎么办?我们取102. 102 % 100 = 2
和2 % 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%!通常不是主要问题,但取决于用例,可能会显示一些奇怪的行为。