I have an array like
$keywords = array('apple'=>10,'orange'=>2,'grape'=>12);
我想随机从数组中选择一个“键”。但是,选取元素的概率分布应该与其值成比例。
I have an array like
$keywords = array('apple'=>10,'orange'=>2,'grape'=>12);
我想随机从数组中选择一个“键”。但是,选取元素的概率分布应该与其值成比例。
将所有值相加(10+2+12等于24);在范围[0, 24)内获取一个随机数,并根据随机数是否位于[0, 10),[10, 12)或[12, 24)中选择相应的元素。
$probabilities = array('apple'=>50, 'orange'=>20, 'banana'=>10);
function random_probability($probabilities) {
$rand = rand(0, array_sum($probabilities));
do {
$sum = array_sum($probabilities);
if($rand <= $sum && $rand >= $sum - end($probabilities)) {
return key($probabilities);
}
} while(array_pop($probabilities));
}
一种O(log(n))的方法(直接从非常相似问题的答案中摘取):
通常的技巧是将数组转换为累加和数组:
[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