在cplusplus.com参考文献中指出,在尝试生成随机数时使用模运算符会降低数字的可能性:
random_var = rand() % 100 + 1; //this will generate numbers between 1-100
Run Code Online (Sandbox Code Playgroud)
为什么较低的数字更可能?如果他们是,为什么我们不使用下面的代码:
random_var = rand()/(RAND_MAX/100) + 1; //also will generate those, more uniform I guess
Run Code Online (Sandbox Code Playgroud)
假设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%!通常不是主要问题,但根据用例,可能会显示一些奇怪的行为.