我有一个值列表,键入0到1之间的双精度数,表示我认为对我来说有用的东西的可能性。例如,要获得问题的答案:
0.5 call your mom
0.25 go to the library
0.6 StackOverflow
0.9 just Google it
所以,我们认为谷歌搜索它是(约)两倍的可能性,因为要求你的妈妈。当我试图弄清楚接下来要做的事情时,我想要“只是谷歌它”的回报率是“打电话给你妈妈”的两倍。
我一直在寻找解决方案但收效甚微。我发现的大部分内容都依赖于整数键(如How to randomly select a key based on its Integer value in a Map with respect to the other values in O(n) time?),这是我没有的,也是我无法轻易生成的。
我觉得应该有一些Java数据类型可以为我做这个。有什么建议?
答案 0 :(得分:1)
您可以考虑基于Java接口NavigableMap的解决方案,如果您使用TreeMap实现,您将始终获得O(logn)复杂性。
您可以使用以下其中一项:
现在你只需要以正确的概率提取随机数。为此我会参考这篇文章:
How to generate a random number from specified discrete distribution?
答案 1 :(得分:1)
如果我理解正确,你要找的是加权随机。
您应该对所有权重求和,并将其归一化为整数值,这样您就可以按照注释的建议使用rand.nextInt。
例如,可以通过乘以100来完成归一化,因此您的归一化权重现在是:
50,25,60,90 - 总和为225
您应该定义范围:
0 - 49代表“打电话给你的妈妈”
50 - 74 - 用于“去图书馆”
现在你需要执行this.rand.nextInt(sum) - 并得到一个值,
并且此值应映射到其中一个已定义的范围。
答案 2 :(得分:0)
如果您跟踪概率的总值,您可以执行以下操作:
double interval = 100;
double counter = 0;
double totalProbabilities = 2.25;
int randInt = new Random().nextInt((int)interval);
for (Element e: list) {
counter += (interval * e.probability() / totalProbabilities);
if (randInt < counter) {
return e.activity();
}
}