从数组中选择元素,其概率与其值成比例

时间:2013-05-10 19:24:06

标签: arrays numpy select random weighted

我有一个双打数组,我想从中选择一个值,每个值被选中的概率与其值成反比。例如:

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编写的,但我可以调整任何伪代码。

4 个答案:

答案 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)

对于反比例:

  1. 对数组求和
  2. 选择0到(n-1)* sum -1
  3. 之间的随机数
  4. 从开头开始累积总和值,直到您>>为随机值。

  5. 这是比例

    注意:所有值必须为正值才能生效。

    1. 对数组求和
    2. 选择介于0和sum-1之间的随机数
    3. 累积从数组开头开始的值,直到您>&gt; =到随机值。

答案 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

查找数组中所有元素的总和。然后在此范围内生成一个随机数。最终选择将是上述函数返回的索引中的元素。