一个非常简单的通用解决方案是:
class Distribution{
List probs = new ArrayList<>();
List events = new ArrayList<>();
double sumProb;
Random rand = new Random();
Distribution(Map probs){
for(T event : probs.keySet()){
sumProb += probs.get(event);
events.add(event);
this.probs.add(probs.get(event));
}
}
public T sample(){
T value;
double prob = rand.nextDouble()*sumProb;
int i;
for(i=0; prob>0; i++){
prob-= probs.get(i);
}
return events.get(i-1);
}
}
您可以根据需要随意更改它,例如添加其他构造函数.当然,从效率开始,这里有很多要改进的东西,但是你可以在以后重复使用.