我有一个装满物品的阵列,我必须从他们所有人中抽出一个。这很简单,但这里有并发症。他们每个人都有可能被抽出。默认机会为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。
最好的方法是什么?
答案 0 :(得分:1)
一种简单的方法是将此数据数组转换为包含给定次数的每个元素的数组,然后使用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)];
}