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];