【发布时间】:2014-07-06 01:59:39
【问题描述】:
假设我们有一个包含一些对象的数组,每个对象都有一定的权重,表示其被选中与其他元素的比率。因此,例如,如果您有一个重量为 10 的物体、一个重量为 30 和一个重量为 35 的物体,则比例为 10:30:35。第一个被选中的概率应该是10/75 = 13.3%,第二个被选中的概率应该是30/75 = 40%,第三个被选中的概率应该是35/75 = 46.6%
现在,假设我们有一个函数,它给定了这个数组,并且必须根据其权重返回一个随机选择的对象。蛮力做到这一点的方法是用 for 循环遍历每个对象并将其权重添加到某个总数中,然后再次遍历循环并查看是否应根据某个随机概率函数选择每个对象:
int totalWeight = 0;
for(Object o: array) {
totalWeight += o.weight;
}
//Now we have the total weight
for(Object o in array) {
/* randomProb(double x) is some function which only returns true x percent of the time */
if(randomProb(o.weight / totalWeight)) {
return o;
}
}
但是假设我们要处理数千个输入,因此对每个输入进行两次迭代是成本密集型的。是否有更简单的算法来确定返回哪个对象,而不必遍历循环一次以找到总权重,然后在每个元素上再次遍历它?
【问题讨论】:
-
您是否以相同的权重多次处理同一组输入?
-
输入包含可能具有不同值的不同字段。这些值大多在一个很小的范围内,因此可能有一些输入除了权重之外是相同的。
-
但我的问题是您是否尝试为同一组权重获取多个随机选项 - 在这种情况下,您可以做一些“准备工作”,然后每次都使用它来有效地选择。
-
猜猜我误解了你在问什么。不,权重是随机的,但在同一范围内。
-
我还是不明白你的意思......这不是关于单个范围,而是你有一组权重,然后用于获取多个随机值?或者你每次都会有一组不同的权重?
标签: java statistics probability