2

In cplusplus.com reference it's stated that, using modulo operator when trying to generate random numbers will make lower numbers more likely:

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

Why are lower numbers more likely? And if they're, why aren't we using this code below :

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

1 回答 1

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%!通常不是主要问题,但根据用例,可能会出现一些奇怪的行为。

于 2013-08-22T23:58:37.607 回答