选择从数组元素的概率正比于它的值(Select element from array with pr

2019-09-02 13:14发布

我有double数组和欲被选择为反比于它的值以选择从它的值与每个值的概率。 例如:

arr[0] = 100
arr[1] = 200

在这个例子中,元素0将有被选择和元件1 33%的几率的66%。 我有困难的编码本。 什么是迄今为止我所做的是计算阵列(例子中是300)的总价值,然后我打得四处计算它们的总数的百分比前反演的数字。 我不能得到任何工作。 最后,我的愿望:

new randomNumber
for(int y=0; y < probabilities.length; y++){
     if(randomNumber < probabilities[y]){
          Select probabilities[y]
     }
}

或东西的影响。 任何帮助吗? 编码是Java,但我可以适应任何伪代码。

Answer 1:

通常的技术是将阵列转化为累加和的数组:

 [10 60 5 25]  --> [10 70 75 100]

选择一个随机数在从零到的累计总数的范围内(在本例中: 0 <= x < 100 )。 然后,使用二分法累积阵列上的索引定位成原始数组:

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,二等分的累积阵列给出了其对应于10原始数组中的0的位置索引。

并且,如果随机变量x是72,二等分的累积阵列给出了其对应于5原始数组中的2的位置索引。

对于成反比,除了在执行所述阵列的初始转换成其倒数,然后生成的累积和阵列的技术中是完全一样的:

[10 60 5 25]  -->  [1/10  1/60  1/5  1/25]  -->  [1/10  7/60  19/60  107/300]


Answer 2:

对于反比:

  1. 综上所述阵列
  2. 挑0和(n-1)*总和之间的随机数-1
  3. 厚积薄发从一开始,直到你开始和值> =为随机值。

这是成正比

注意:所有的值必须为正为此工作。

  1. 综上所述阵列
  2. 挑0和总和-1之间的随机数
  3. 直到你积累从阵列的开头开始的值> =于随机值。


文章来源: Select element from array with probability proportional to its value