2015-10-27 43 views
-2

我有一个HashMap。其中Key是playerName,value是ticketCount。例如:player1有10张门票,player2有20张门票。用Java计算加权概率

我想创建一个方法,它将返回一个playerName,当一个随机数(它是生成的)传入它。例如:如果3通过,它应该返回player1等

我有以下方法来计算概率,不知道它是否正确。

  1. 计算每个ticketCount的概率范围,然后使用if else语句比较随机数和范围。例如:如果randomNumber < = .33返回player1或randomNumber> .33和< .66,则返回player2。

  2. 创建另一个具有与ticketCounts的索引对应的playerNames的数组。例如:索引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++){ 

    } 
} 

这是我到目前为止所。无法弄清楚approach2代码。 :(

+1

所以,什么你的问题在哪里是你的代码 – redFIVE

+0

对于第二部分,我想应该是另一种方式around..how从让每个球员的概率去搞清楚哪个球员?实际上是根据生成的随机数赢得的。 – kaila88

回答

0

你的算法应该依赖于确切的问题如果顺序很重要(例如在Tombola /抽奖中),那么只要结构适合内存就可以转到第二个解决方案,在这种情况下, 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);