Mysql
 sql >> база данни >  >> RDS >> Mysql

Случайна претеглена селекция на събитие

Два начина да направя това, за които се сещам от върха на главата си:

Вариант 1:Попълнете нов масив с ключовите стойности от набора данни, където теглото определя колко често се повтаря даден елемент. След това пропорцията в този масив съответства на претегленото разпределение. Просто вземете с помощта на $arr[array_rand($arr)] . Макар че е просто и лесно за разбиране, това ще избухне в лицето ви, ако има МНОГО артикули или ако стойностите на теглото са наистина високи.

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

Вариант 2. Сумирайте теглата. Изберете произволно число между 0 и сумата на теглата. Прегледайте елементите в набора от данни, сравнете с произволното число, което сте избрали. Веднага щом ударите такъв, който е равен или по-голям от произволния индекс, изберете този елемент.

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

След нашия разговор в коментарите по-долу, ето Pastebin с кода в него:

http://pastebin.com/bLbhThhj



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какъв е най-добрият начин да използвате LEFT OUTER JOIN, за да проверите за несъществуване на свързани редове

  2. Оптимизация на заявки за използване на MySQL индекс

  3. MySQL Един към много към JSON формат

  4. Amazon RDS Aurora срещу RDS MySQL срещу MySQL на EC2?

  5. Python Pandas записват в sql с NaN стойности