Java:随机数生成器中的过度代表候选人?
下面是在“Java算法和客户端-算法,第四版”的StdRandom类中生成长类型随机数的方法Java:随机数生成器中的过度代表候选人?,java,random,Java,Random,下面是在“Java算法和客户端-算法,第四版”的StdRandom类中生成长类型随机数的方法 公共静态长制服(长n){ 如果(n>>1; 而(u+m-(r=u%n)>>1; } 返回r; } 有人能解释一下(u+m-(r=u%n)
公共静态长制服(长n){
如果(n>>1;
而(u+m-(r=u%n)<0L){
u=random.nextLong()>>>1;
}
返回r;
}
有人能解释一下(u+m-(r=u%n)<0L)部分在做什么吗?我不明白“过度代表候选人”是什么意思.对不起,伙计们,我现在可以理解它的意思了。它可以防止位于长度n的最大不完整间隔处的随机数。我只能假设它与javadoc中的这段引用有关,
nextLong()
,“因为类random使用的种子只有48位,所以此算法不会返回所有可能的长值。”但这段代码似乎与48位无关。也许有一些隐藏的数学技巧?
public static long uniform(long n) {
if (n <= 0L) throw new IllegalArgumentException("argument must be positive: " + n);
// https://docs.oracle.com/javase/8/docs/api/java/util/Random.html#longs-long-long-long-
long r = random.nextLong();
long m = n - 1;
// power of two
if ((n & m) == 0L) {
return r & m;
}
// reject over-represented candidates
long u = r >>> 1;
while (u + m - (r = u % n) < 0L) {
u = random.nextLong() >>> 1;
}
return r;
}