我想创建一个介于0和n之间的随机值。作为源,我从Oracle接收到一个随机的256位值。
只要做
source % (n + 1)
引入模偏置。我见过的模偏差的解决方案是进行while循环,直到该值位于适合源范围的n的最大倍数之内-但在我的情况下,我只能绘制一次随机源值。
尽管我的n小得多,比2 ^ 32小。在这种情况下,有什么方法可以生成没有模偏差的随机值?
答案 0 :(得分:0)
在假设您的随机数生成器是统一的情况下,除非0
是{{的除数,否则无法将其映射到n
到n+1
上的无偏生成器。 1}}。这是因为除非2^256
划分2^256
,否则不可能将大小为n+1
的集合划分为n+1
个等概率的子集。话虽这么说,如果2^256
比n
小得多,则在进行类似2^256
之类的事情时偏离均匀性将是微不足道的。