我有一个满是项的数组,我只需要从所有项中提取一个。这很简单,但也有复杂之处。他们每个人被抽中的几率都不尽相同。默认几率为1。0表示该元素永远不会被选中,2表示该元素被选中的机会加倍。
$elements = array(
"A" => "1", // normal chance to be selected (= 25%)
"B" => "1", // normal chance to be selected (= 25%)
"C" => "2", // double chance to be selected (= 50%)
"D" => "0" // no chance to be selected (= 0%)
)
这只是一个简单的例子,但我合适的数组有2000+个元素,机会从0到20。
最好的方法是什么?
一种简单的方法是将此数据数组转换为一个数组,该数组包含给定次数的每个元素,然后使用array_rand()
从中进行选择。举个例子,如果将其转换为array("A", "B", "C", "C")
,则可以获得所需的概率。
这里有一些代码来进行转换:
function pickFromArray($elements) {
$optionsPool = [];
foreach ($elements as $item => $occurrences) {
for ($i = 0; $i < $occurrences; $i++) {
$optionsPool[] = $item;
}
}
return $optionsPool[array_rand($optionsPool)];
}