【发布时间】:2019-05-11 19:05:34
【问题描述】:
我有一个包含 10 个元素的数组。
|1|2|3|4|5|6|7|8|9|10|
这个想法是从这个数组中随机查看一个值,但要使用一些概率量。
元素的概率选择如下:
|5%|10%|15%|30%|20%|4%|6%|1%|3%|6%|
这意味着选择第一个元素有 5% 的机会,第二个元素有 10% 的机会等等。
我的解决方案:
import java.util.*;
public class Example {
public static void main( String[] args ) {
int [] values = {1,2,3,4,5,6,7,8,9,10};
double [] probabilities = {0.05,0.1,0.15,0.3,0.2,0.04,0.06,0.01,0.03,0.06};
double cumulativeSum = 0;
double r = new Random().nextDouble();//random number between 0 and 1
int index=0;// index of the chosen value
for (double prob:probabilities) {
cumulativeSum += prob;
if (cumulativeSum >= r) {
break;
}
index++;
}
System.out.println(index);
System.out.println("the value picked "+values[index]);
}
}
我正在寻找比我更快的解决方案。我做的数组只是一个小例子,通常我可以有 10000 个单元格的数组。
【问题讨论】:
-
你的概率总和为 101%
-
stackoverflow.com/questions/1761626/weighted-random-numbers 有一个很好的答案。因此,如果您将拥有包含大量数字的数组,则可以使用具有累积权重的二叉搜索树
-
@vlad324 您链接的答案与OP的解决方案几乎相同。
-
@P.Soutzikevich 是的,但是 OP 提到他有很大的输入数组,我建议他使用具有累积权重的二叉搜索树而不是数组,因为它会更快,这是预期结果使他的代码更快。二叉搜索树的想法不是我的,所以我附上链接,因为它有更多的细节