[英]Calculate weighted probability in Java
我有一个哈希映射。 其中 Key 是 playerName,value 是 ticketCount。 例如:玩家 1 有 10 张票,玩家 2 有 20 张票。
我想创建一个方法,当传入一个随机数(生成的)时,该方法将返回一个 playerName。 例如:如果 3 被传递,它应该返回 player1 等。
我有以下方法来计算概率,不确定它是否正确。
计算每个 ticketCount 的概率范围,然后进行 if else 语句来比较随机数和范围。 例如:如果 randomNumber <= .33 返回 player1 或者如果 randomNumber >.33 并且 < .66,则返回 player2。
制作另一个数组,其中 playerNames 对应于 ticketCounts 的索引。 例如:索引 1-10 将有 player1 等。然后执行二分查找。
公开课彩票{
public void calculateWinner(HashMap lotteryMap){
double total = 0;
Set<String> keySet = lotteryMap.keySet();
Iterator<String> keySetIterator = keySet.iterator();
while (keySetIterator.hasNext()) {
String key = keySetIterator.next();
total = total + (Double)lotteryMap.get(key);
}
populateRangeArray(lotteryMap, total);
}
//Approach 1
public ArrayList<Double> populateRangeArray(HashMap lotteryMap, double total){
ArrayList<Double> rangeArray = new ArrayList<Double>();
Set<String> keySet = lotteryMap.keySet();
Iterator<String> keySetIterator = keySet.iterator();
while (keySetIterator.hasNext()) {
String key = keySetIterator.next();
double value = total/(Double)lotteryMap.get(key);
rangeArray.add(value);
}
return rangeArray;
}
//Approach 2
public void populatePlayerArray(HashMap lotteryMap, double total){
int newTotal = (int)total;
String[] playerArray = new String[newTotal];
for(int i=0;i<newTotal;i++){
}
}
这是我到目前为止。 无法弄清楚方法2代码明智。 :(
您的算法应该取决于确切的问题。 如果顺序很重要(例如在 tombola/raffle 中),那么只要结构适合内存,您就可以使用第二种解决方案。 在这种情况下,您可以使用Guava RangeMap :
Map<String, Integer> players = ImmutableMap.of( "player1",10, "player2",20 );
RangeMap<Integer, String> tickets = TreeRangeMap.create();
int lower = 0;
for (Entry<String, Integer> player : players.entrySet()) {
int upper = lower + player.getValue();
tickets.put(Range.closed(lower, upper - 1), player.getKey());
lower = upper;
}
Integer ticket = ThreadLocalRandom.current().nextInt(0, lower);
String winner = tickets.get(ticket);
System.out.printf("And the winner is %s with ticket #%d%n", winner, ticket);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.