在 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
最佳答案
假设 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%!通常不是主要问题,但根据用例,可能会显示一些奇怪的行为。
关于c++ - 在 C++ 中生成均匀分布的伪随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18392522/