我对java比较陌生,一直在开发一个涉及概率的程序。目前,我陷入了这样的境地:我有一个看起来像这样的字典/ map /hashMap。
["Charlie":0.2,"Fred":0.1,"Ricky":0.5,"Damon":0.2]
由此我想要一个函数,有 20% 的机会选择查理,10% 的机会选择弗雷德等等......
但是,我不知道如何解决这个问题。我完全迷失了。感谢您的帮助。
编辑:一些额外的信息。 我需要它是可扩展的,因为列表的大小可能会有所不同。而且,它只需要返回一个值。
最佳答案
这个怎么样(我测试过并且有效):
String[] keys = map.keySet().toArray(new String[map.size()]);
Double[] values = map.values().toArray(new Double[map.size()]);
for(int x=1; x<values.length; x++)
values[x] += values[x-1]; //Accumulate probabilities
double rand = Math.random();
for(int x=0; x<values.length; x++){
if(rand < values[x])
System.out.println(keys[x]);
break;
}
<小时/>
说明:
累积每个名称的概率:
Charlie: 0.0-0.2
Fred: 0.2-0.3
Ricky: 0.3-0.8
Damon: 0.8-1.0
然后只需滚动一个随机数并检查它是否属于谁的范围。 Ricky 的范围比其他人更大(在本例中为 50%),因此它有 50% 的机会被选中。
前 15 次运行:
Fred
Ricky
Charlie
Ricky
Ricky
Damon
Charlie
Damon
Fred
Charlie
Fred
Charlie
Ricky
Ricky
Ricky
将代码运行次数控制在 1000 万次以下:
Charlie: 19.98881%
Fred: 10.014190000000001%
Rcicky: 50.00255%
Damon: 19.99445%
关于java - 根据字典中的百分比选择选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45896185/