sql >> Database teknologi >  >> RDS >> Mysql

Tilfældigt vægtet valg af en begivenhed

To måder at gøre dette på, som jeg kan tænke på fra toppen af ​​mit hoved:

Mulighed 1:Udfyld et nyt array med nøgleværdierne fra datasættet, hvor vægten bestemmer, hvor ofte et emne gentages. Andelen i dette array matcher derefter den vægtede fordeling. Bare tag fat med $arr[array_rand($arr)] . Selvom det er enkelt og let at forstå, vil dette eksplodere i dit ansigt, hvis der er MANGE genstande, eller hvis vægtværdierne er virkelig høje.

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

Mulighed 2. Sum vægtene. Vælg et tilfældigt tal mellem 0 og sum-of-weights. Sløjfe over elementerne i datasættet, sammenlign med det tilfældige tal, du valgte. Så snart du rammer en, der er lig med eller større end det tilfældige indeks, skal du vælge det 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;
}

Efter vores samtale i kommentarerne nedenfor, er her en Pastebin med koden i:

http://pastebin.com/bLbhThhj



  1. MySQL Database Service – Nye HeatWave-innovationer

  2. Kan ikke oprette forbindelse til heroku postgresql-database fra lokal node-app med efterfølger

  3. Java-fil upload til MySQL

  4. MySql Bulk indsæt