我需要使用难以获得的随机位生成在任意大范围内的无偏均匀分布整数,因此我希望平均使用尽可能少的随机位。
生成的数字应该在0到N-1之间,其中N是给定的范围。
我现在正在做的是:
- 通过某种方式计算N中的位数B;在数学上,B = ceil(log(N)/log(2))。
- 生成B个随机位。
- 如果生成的随机位形成的整数小于N,则返回它们。否则,返回步骤2。
最好的情况是N是2的幂次方;那么你什么都不会拒绝。但最坏的情况是N是2的幂次方加1;在这种情况下,随着B的增长,你每次尝试都会趋近于拒绝概率为1/2。这让我觉得很浪费,所以我想知道是否有更好的算法可以平均使用更少的位。
例如,当生成的位数>= N时,如果我按预定义顺序排列位位置而不是拒绝它们,希望找到一个在范围内的这样的排列,并且只有在没有一个排列成功时才生成新的批次,那么结果是否均匀分布?