これを行うには、頭のてっぺんから考えることができる2つの方法があります。
オプション1:データセットのキー値を新しい配列に入力します。ここで、重みによってアイテムが繰り返される頻度が決まります。この配列の比率は、加重分布と一致します。 $arr[array_rand($arr)]
を使用して取得するだけです 。シンプルでわかりやすいですが、アイテムがたくさんある場合、または重量値が非常に高い場合、これはあなたの顔に爆発します。
$weighted = array();
foreach($items as $item) {
array_merge($weighted, array_fill(0, $item['weight'], $item['value']);
}
$result = $weighted[array_rand($weighted)];
オプション2。重みを合計します。 0から重みの合計までの乱数を選択します。データセット内の要素をループし、選択したランダムな数値と比較します。ランダムインデックス以上の要素をヒットしたらすぐに、その要素を選択します。
function findRandomWeighted(array $input) {
$weight = 0;
// I'm assuming you can get the weight from MySQL as well, so this loop really should not be required. In that case $weight becomes a parameter.
foreach($items as $item) {
$weight += $item['weight'];
}
$index = rand(1, $weight);
foreach($items as $item) {
$index -= $item['weight'];
if($index <= 0) { return $item['value'] }
}
return null;
}
以下のコメントでの会話に続いて、コードが含まれているPastebinがあります: