簡體   English   中英

在 Java 中計算加權概率

[英]Calculate weighted probability in Java

我有一個哈希映射。 其中 Key 是 playerName,value 是 ticketCount。 例如:玩家 1 有 10 張票,玩家 2 有 20 張票。

我想創建一個方法,當傳入一個隨機數(生成的)時,該方法將返回一個 playerName。 例如:如果 3 被傳遞,它應該返回 player1 等。

我有以下方法來計算概率,不確定它是否正確。

  1. 計算每個 ticketCount 的概率范圍,然后進行 if else 語句來比較隨機數和范圍。 例如:如果 randomNumber <= .33 返回 player1 或者如果 randomNumber >.33 並且 < .66,則返回 player2。

  2. 制作另一個數組,其中 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM