Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pilihan tertimbang acak dari suatu acara

Dua cara untuk melakukan ini, yang dapat saya pikirkan dari atas kepala saya:

Opsi 1:Isi larik baru dengan nilai kunci dari kumpulan data, di mana bobot menentukan seberapa sering item diulang. Proporsi dalam larik ini kemudian cocok dengan distribusi berbobot. Cukup ambil menggunakan $arr[array_rand($arr)] . Meskipun sederhana dan mudah dimengerti, ini akan meledak di wajah Anda jika ada BANYAK item, atau jika nilai bobotnya sangat tinggi.

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

Opsi 2. Jumlahkan bobotnya. Pilih nomor acak antara 0 dan jumlah bobot. Ulangi elemen dalam kumpulan data, bandingkan dengan nomor acak yang Anda pilih. Segera setelah Anda menekan salah satu yang sama dengan atau lebih besar dari indeks acak, pilih elemen tersebut.

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

Mengikuti percakapan kami di komentar di bawah, ini adalah Pastebin dengan kode di dalamnya:

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. Skema DB Untuk Obrolan?

  2. Bagaimana cara mengekstrak dua digit berturut-turut dari bidang teks di MySQL?

  3. cara menggunakan LIKE dengan nama kolom

  4. Bagaimana Anda mengatur pager default untuk klien MySQL?

  5. Blog dan Situs Web MySQL Teratas untuk Administrator Basis Data