sql >> Database >  >> RDS >> Mysql

Willekeurig gewogen selectie van een evenement

Twee manieren om dit te doen, die ik uit mijn hoofd kan bedenken:

Optie 1:Vul een nieuwe array met de sleutelwaarden uit de gegevensset, waarbij het gewicht bepaalt hoe vaak een item wordt herhaald. De proportie in deze array komt dan overeen met de gewogen verdeling. Gewoon pakken met $arr[array_rand($arr)] . Hoewel eenvoudig en gemakkelijk te begrijpen, zal dit in je gezicht exploderen als er VEEL items zijn of als de gewichtswaarden erg hoog zijn.

$weighted = array();
foreach($items as $item) {
    array_merge($weighted, array_fill(0, $item['weight'], $item['value']);
}
$result = $weighted[array_rand($weighted)];

Optie 2. Tel de gewichten op. Kies een willekeurig getal tussen 0 en som-van-gewichten. Loop over de elementen in de dataset, vergelijk met het willekeurige getal dat je hebt gekozen. Zodra je er een raakt die gelijk is aan of groter is dan de willekeurige index, selecteer je dat element.

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;
}

Na ons gesprek in de reacties hieronder, is hier een Pastebin met de code erin:

http://pastebin.com/bLbhThhj



  1. Wat zijn de voordelen van een datamanagementsysteem?

  2. PostgreSQL-implementatie en onderhoud met Ansible

  3. MySQL SELECT *-query parallel uitvoeren

  4. Goede preventie van MYSQL-injectie?