用Java计算加权概率

时间:2015-10-27 22:09:18

标签: java probability probability-density

我有一个HashMap。其中Key是playerName,value是ticketCount。例如:player1有10张票,而player2有20张票。

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

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

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

  2. 创建另一个数组,其中playerNames对应于ticketCounts的索引。例如:索引1-10将包含player1等。然后执行二进制搜索。

  3. 公共课彩票{

    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。 :(

1 个答案:

答案 0 :(得分:0)

您的算法应该取决于确切的问题。如果订单很重要(例如在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);