我有一个双打数组,我想从中选择一个值,每个值被选中的概率与其值成反比。例如:
arr[0] = 100
arr[1] = 200
在这个例子中,元素0将被选中66%而元素1有33%的可能性。我编码很困难。到目前为止我所做的是计算数组的总值(例子是300),然后我在计算它们之前使用了反转数字,然后计算总数的百分比。我无法得到任何工作。最后我希望:
new randomNumber
for(int y=0; y < probabilities.length; y++){
if(randomNumber < probabilities[y]){
Select probabilities[y]
}
}
或那些影响的东西。有帮助吗?编码是用Java编写的,但我可以调整任何伪代码。
答案 0 :(得分:12)
通常的技术是将数组转换为累积和数组:
[10 60 5 25] --> [10 70 75 100]
选择从零到累计总数的范围内的随机数(在示例中为0 <= x < 100
)。然后,在累积数组上使用bisection将索引定位到原始数组中:
Random variable x Index in the Cumulative Array Value in Original Array
----------------- ----------------------------- ----------------------
0 <= x < 10 0 10
10 <= x < 70 1 60
70 <= x < 75 2 5
75 <= x < 100 3 25
例如,如果随机变量 x 为4,则将累积数组二等分给出位置索引0,其对应于原始数组中的10。
并且,如果随机变量 x 是72,则将累积数组二等分给出位置索引2,其对应于原始数组中的5。
对于反比例,除了您将数组初始转换为其倒数然后构建累积和数组之外,该技术完全相同:
[10 60 5 25] --> [1/10 1/60 1/5 1/25] --> [1/10 7/60 19/60 107/300]
答案 1 :(得分:1)
注意:所有值必须为正值才能生效。
答案 2 :(得分:1)
我遇到了同样的问题并提出了一些简单的解决方案。不完美,但适合某些情况。
你有一些数字[1,2,3,...]的数组,你需要选择一个概率值[10,5,20,...]只需要新数组并重复每个值它有多少概率,例如
arr[] = [1,1,1,1,...(10 times),2,2,2,..(5 times),3,3,3,3,...(20 times)];
他们只是得到从0到新数组长度的随机数,并以理想的概率得到你的数值。
int r = Random(0,arr.count);
int value = arr[r];
正如我所提到的那样,它不是完美的,而且它不是内存有效的算法,但它可以工作。
答案 3 :(得分:0)
Php代码:
WAITING
查找数组中所有元素的总和。然后在此范围内生成一个随机数。最终选择将是上述函数返回的索引中的元素。