本文实例为大家分享了java随机数生成代码,供大家参考,具体内容如下
package com.gonvan.common.utils;
import java.util.*;
public final class LotteryAliasMethod {
private final Random random;
private final int[] alias;
private final double[] probability;
public LotteryAliasMethod(List probabilities) {
this(probabilities, new Random());
}
public LotteryAliasMethod(List probabilities, Random random) {
if (probabilities == null || random == null)
throw new NullPointerException();
if (probabilities.size() == 0)
throw new IllegalArgumentException("Probability vector must be nonempty.");
probability = new double[probabilities.size()];
alias = new int[probabilities.size()];
this.random = random;
final double average = 1.0 / probabilities.size();
probabilities = new ArrayList(probabilities);
Deque small = new ArrayDeque();
Deque large = new ArrayDeque();
for (int i = 0; i < probabilities.size(); ++i) {
if (probabilities.get(i) >= average)
large.add(i);
else
small.add(i);
}
while (!small.isEmpty() && !large.isEmpty()) {
int less = small.removeLast();
int more = large.removeLast();
probability[less] = probabilities.get(less) * probabilities.size();
alias[less] = more;
probabilities.set(more, (probabilities.get(more) + probabilities.get(less)) - average);
if (probabilities.get(more) >= 1.0 / probabilities.size())
large.add(more);
else
small.add(more);
}
while (!small.isEmpty())
probability[small.removeLast()] = 1.0;
while (!large.isEmpty())
probability[large.removeLast()] = 1.0;
}
public int next() {
int column = random.nextInt(probability.length);
boolean coinToss = random.nextDouble() < probability[column];
return coinToss ? column : alias[column];
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助。



