0

我有一个值列表,用 0 到 1 之间的双精度键表示我认为某事物对我有用的可能性。例如,要获得问题的答案:

0.5   call your mom
0.25  go to the library
0.6   StackOverflow
0.9   just Google it

因此,我们认为谷歌搜索它的帮助可能是询问你妈妈的(大约)两倍。当我试图找出下一步要做的事情时,我希望“只是谷歌它”的返回频率大约是“打电话给你妈妈”的两倍。

我一直在寻找解决方案,但收效甚微。我发现的大多数东西都依赖于整数键(例如如何根据 Map 中的整数值相对于 O(n) 时间内的其他值随机选择一个键?),我没有有并且我不能轻易生成。

我觉得应该有一些 Java 数据类型可以为我做到这一点。有什么建议么?

4

3 回答 3

1

你可以想到一个基于java接口NavigableMap的解决方案,如果你使用TreeMap实现你总是会得到O(logn)的复杂度。

您可以使用以下方法之一:

  • 较低的入口
  • 天花板入口
  • 楼层入口
  • 更高的条目

现在您只需要以正确的概率提取随机数。为此,我会参考这篇文章:

如何从指定的离散分布生成随机数?

于 2012-07-19T15:07:18.653 回答
1

如果我理解正确,您正在寻找的是加权随机数。
您应该将所有权重相加,并可能将其标准化为整数值,这样您就可以按照评论的建议使用 rand.nextInt 。
例如,可以通过乘以 100 来进行归一化,因此您的归一化权重现在为:
50、25、60、90 - 总和为 225。
您应该定义范围:
0 - 49 用于“打电话给你妈妈”
50 - 74 -用于“去图书馆”

现在您需要执行 this.rand.nextInt(sum) - 并获取一个值,
该值应映射到定义的范围之一。

于 2012-07-19T15:11:27.610 回答
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();
  }
}
于 2012-07-19T15:15:19.273 回答