我沒有評論@ PeterLawrey的評論 答案:Random weighted selection in Java。這很好。但現在我打電話next()
得到A的結果,並想從map
中刪除A的重量,以避免再次得到A.我該如何處理它?隨機加權選擇,然後刪除重量
回答
您可以簡單地改變這條線,在PeterLawrey的解決方案
public E next() {
double value = random.nextDouble() * total;
return map.higherEntry(value).getValue();
}
到
public E next() {
double value = random.nextDouble() * total--;
return map.remove(higherKey(value));
}
原因remove()
去除
或者之後返回相關的值,如果你需要後刪除元素選擇你可以使用其他解決方案。所有的元素添加到「鏈表」,每個元件必須加入許多次,因爲它重量,然後使用Collections.shuffle()
其中,根據JavaDoc
隨機使用的置換隨機性的缺省源指定列表。所有排列發生的可能性幾乎相等。
最後,獲取和使用pop()
或removeFirst()
刪除元素
Map<String, Integer> map = new HashMap<String, Integer>() {{
put("Five", 5);
put("Four", 4);
put("Three", 3);
put("Two", 2);
put("One", 1);
}};
LinkedList<String> list = new LinkedList<>();
for (Map.Entry<String, Integer> entry : map.entrySet()) {
for (int i = 0; i < entry.getValue(); i++) {
list.add(entry.getKey());
}
}
Collections.shuffle(list);
System.out.println("Size: " + list.size());
int size = list.size();
for (int i = 0; i < size; i++) {
System.out.println(list.pop());
}
System.out.println("Size: " + list.size());
@kinglao我的回答有用嗎?你能選擇它作爲正確的嗎? –
我認爲只是刪除無法正常工作。因爲'total'字段也應該改變 – kinglao
@kinglao當然,它也應該根據程序邏輯進行更改。也許,第二種解決方案將更適合您的目的。 –
- 1. 隨機加權選擇
- 2. SQL選擇然後刪除
- 3. PHP選擇隨機數與權重
- 4. 如何從int數組中隨機選擇,然後刪除選中的元素
- 5. 帶類別的加權隨機選擇
- 6. T-SQL中的隨機加權選擇
- 7. 熊貓隨機加權選擇
- 8. 隨機選擇加權最低
- 9. 挑選然後刪除隨機元素和arraylist
- 10. Python:從列表中選擇隨機單詞,然後將其刪除
- 11. PHP選擇隨機但變量有不同的權重
- 12. 選擇帶重量的隨機物品
- 13. MySql查詢選擇然後刪除
- 14. 選擇獲得結果然後刪除
- 15. 加權隨機選號
- 16. 隨機選擇加權最近的選擇
- 17. 獲取隨機數生成器以在選擇完成後刪除選擇? JAVA
- 18. 帶兩個權重的加權隨機
- 19. 刪除TextChangedListener然後重新添加它
- 20. 負重隨機選擇
- 21. jquery動態ID選擇器,刪除然後添加類
- 22. 從列表中選擇一個隨機項目,然後刪除隨機選擇的項目中包含相同單詞的後續列表項目?
- 23. REXX選擇隨機發言權命令
- 24. 選擇隨機
- 25. 隨機選擇
- 26. 隨機選擇
- 27. 隨機選擇
- 28. 根據x個權重選擇x個隨機行
- 29. 隨機選擇Python列表中的列表,取決於權重
- 30. 根據另一行上的權重選擇隨機行
[Java中隨機加權選擇(可能的重複https://stackoverflow.com/questions/6409652/random-weighted-selection -in-java) –