如何绘制可选择的可变机会元素


How to draw element with variable chance to be choosed

我有一个满是项的数组,我只需要从所有项中提取一个。这很简单,但也有复杂之处。他们每个人被抽中的几率都不尽相同。默认几率为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)];
}