我没有评论@ 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. 随机选择加权最低
- 3. T-SQL中的随机加权选择
- 4. 带类别的加权随机选择
- 5. 挑选然后删除随机元素和arraylist
- 6. PHP选择随机但变量有不同的权重
- 7. 选择带重量的随机物品
- 8. 选择获得结果然后删除
- 9. 随机选择加权最近的选择
- 10. 获取随机数生成器以在选择完成后删除选择? JAVA
- 11. 负重随机选择
- 12. jquery动态ID选择器,删除然后添加类
- 13. 从列表中选择一个随机项目,然后删除随机选择的项目中包含相同单词的后续列表项目?
- 14. 随机选择
- 15. 随机选择
- 16. 随机选择
- 17. 随机选择Python列表中的列表,取决于权重
- 18. 以随机顺序选择行,然后将其颠倒
- 19. MySQL的 - 选择特定的行,然后才随机他们
- 20. MySQL选择有序的行,然后随机化结果
- 21. 选择一列,然后插入该列再次随机
- 22. 如何随机选择一个数组,然后在javaScript中随机选择一个元素?
- 23. 如何选择一个随机数组,然后在THAT数组中选择一个随机索引?
- 24. 选择前10行,然后选择它们的5个随机行
- 25. 是否可以一次选择一个随机文档,然后再不选择?
- 26. 删除选择后SWT选择事件
- 27. 选择后删除DropDownList值
- 28. 从排序列表中加权随机选择
- 29. 我如何从Python的Counter类获得加权随机选择?
- 30. 如何在Javascript中选择加权随机数组元素?
[Java中随机加权选择(可能的重复https://stackoverflow.com/questions/6409652/random-weighted-selection -in-java) –