java - 根据字典中的百分比选择选项

标签 java

我对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/

相关文章:

java - 在 gradle 中包含 javafx.util.Pair 作为依赖项

java - 如何在 Hibernate 中正确映射一对多关系?

java - 在bash中编译并启动java文件而不保存编译文件

java - 如何等待JDO中的事务结束?

java - JPA/Hibernate 无法确定类型

java - android URLConnection 和 cookies

java - 使用jdbc(windows身份验证模式)从java连接到sql server

java - 伪代码数组符号混淆

java - 将用户输入添加到ArrayList java

java - 在 iOS (Swift) 上进行 RSA 签名并在 Java 中进行验证