Dva způsoby, jak to udělat, které mě napadají z hlavy:
Možnost 1:Vyplňte nové pole klíčovými hodnotami ze sady dat, kde váha určuje, jak často se položka opakuje. Podíl v tomto poli pak odpovídá váženému rozdělení. Jednoduše uchopte pomocí $arr[array_rand($arr)]
. I když je to jednoduché a snadno pochopitelné, vybuchne vám to do obličeje, pokud je tam HODNĚ předmětů nebo pokud jsou hodnoty hmotnosti opravdu vysoké.
$weighted = array();
foreach($items as $item) {
array_merge($weighted, array_fill(0, $item['weight'], $item['value']);
}
$result = $weighted[array_rand($weighted)];
Možnost 2. Sečtěte váhy. Vyberte náhodné číslo mezi 0 a součtem vah. Prohlédněte si prvky v datové sadě a porovnejte s náhodným číslem, které jste vybrali. Jakmile narazíte na takový, který je roven nebo větší než náhodný index, vyberte tento prvek.
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;
}
Po naší konverzaci v komentářích níže je zde Pastebin s kódem: