sql >> Databáze >  >> RDS >> Mysql

Náhodný vážený výběr události

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:

http://pastebin.com/bLbhThhj



  1. SQL count(*) výkon

  2. Automatické zvýšení v Oracle bez použití spouštěče

  3. Jak zakázat omezení CHECK v SQL Server (příklady T-SQL)

  4. Vyberte více duplikátů polí z databáze MySQL