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

Arrays 以与其值成比例的概率从数组中选择元素,arrays,numpy,select,random,weighted,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++){

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

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和n-1*和-1之间的随机数 从头到尾累积总和值,直到>=等于随机值。 这是按比例的 注意:所有值都必须为正值才能工作

对数组求和 在0和总和1之间选择一个随机数 从数组的开头开始累积值,直到>=为随机值为止。
通常的技术是将数组转换为累积和的数组:

 [10 60 5 25]  --> [10 70 75 100]
在示例:0Php代码中,选择从零到累计总数范围内的随机数:

/**
 * Returns a random item from an array based on a weighted value.
 * @param array $array ['foo' => 70, 'bar' => 30] Foo has a 70 percent chance of being returned
 * @return int|string
 */
public function randomize(array $array)
{
    $sumOfWeights = array_sum($array);

    $random = rand(1, $sumOfWeights);
    foreach ($array as $name => $weight) {
        $random -= $weight;

        if ($random <= 0) {
            return $name;
        }
    }

}

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

我也遇到了同样的问题,并提出了一些简单的解决方案。不完美,但适合某些情况

你有一个包含一些数字[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];

正如我提到的,它不是完美的,也不是内存效率高的算法,但它是有效的。

谢谢,但这不是产生成比例而不是成反比的随机性吗?数字越小,选择的可能性就越大。感谢您花时间做这件事。我早期对逆比例性的想法是对数组求和,然后在数组上循环,执行:arraySum-arr[x],这样我们就可以对小值取大值,反之亦然。但是,将其转换为功能性的东西..是的,我也这么想,但是当我在数组中使用了2个以上的值时,我被绊倒了。您还必须调整随机值范围,请参见编辑比例算法,随机数应介于0和sum之间,而不是0和sum-1之间。对于这个数组:{1,1,1],第三个元素永远不会被选取。如果数组和为一个值,你能提供如何对分以识别一个数字是否在一个值的范围内的代码吗?@Azizbro请参阅
arr[] = [1,1,1,1,...(10 times),2,2,2,..(5 times),3,3,3,3,...(20 times)];
int r = Random(0,arr.count);
int value = arr[r];