sql >> Databasteknik >  >> RDS >> Mysql

Slumpmässigt viktat urval av en händelse

Två sätt att göra detta, som jag kan tänka på från toppen av mitt huvud:

Alternativ 1:Fyll en ny array med nyckelvärdena från datauppsättningen, där vikten avgör hur ofta ett objekt upprepas. Andelen i denna array matchar sedan den viktade fördelningen. Ta bara tag med $arr[array_rand($arr)] . Även om det är enkelt och lätt att förstå, kommer detta att explodera i ditt ansikte om det finns MÅNGA föremål eller om viktvärdena är riktigt höga.

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

Alternativ 2. Summa vikterna. Välj ett slumpmässigt tal mellan 0 och summa-of-weights. Slinga över elementen i datamängden, jämför med det slumptal du valde. Så snart du träffar en som är lika med eller större än det slumpmässiga indexet, välj det elementet.

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 vår konversation i kommentarerna nedan, här är en Pastebin med koden i den:

http://pastebin.com/bLbhThhj



  1. OCH-fältet NOT IN(NULL) returnerar en tom uppsättning

  2. Hur man infogar en klump i en databas med sql server management studio

  3. MariaDB JSON_MERGE_PATCH() Förklarad

  4. Postgres slutade precis slumpmässigt att fungera (Rails, PGSQL.5432)