根据双击按比例选择一个值



我有一个值列表,用介于0和1之间的双精度键键入,表示我认为一件事对我有用的可能性。例如,为了获得问题的答案:

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

所以,我们认为在谷歌上搜索它的帮助可能是询问你妈妈的两倍。当我想知道下一步该做什么时,我希望"谷歌一下"的回复频率是"给你妈妈打电话"的两倍。

我一直在寻找解决方案,但收效甚微。我发现的大多数事情都依赖于拥有整数键(比如如何根据映射中的整数值相对于O(n)时间中的其他值随机选择一个键?),这是我没有的,也是我无法轻易生成的。

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

您可以考虑一个基于java接口NavigableMap的解决方案,如果您使用TreeMap实现,您将始终获得O(logn)复杂性。

您可以使用以下选项之一:

  • lowerEntry
  • 天花板入口
  • 地板入口
  • higherEntry

现在你只需要提取具有正确概率的随机数。为此,我将参考这篇文章:

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

如果我理解正确,您要查找的是加权随机数
您应该对所有权重求和,也许可以将其归一化为一个整数值,这样您就可以按照注释的建议使用rand.nextInt了
例如,归一化可以通过乘以100来完成,因此归一化权重现在为:
50、25、60、90——总数是225
您应该定义范围:
0-49表示"给妈妈打电话"
50-74-表示"去图书馆"

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

如果你跟踪概率的总值,你可以做这样的事情:

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();
  }
}

最新更新