Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Lựa chọn có trọng số ngẫu nhiên của một sự kiện

Hai cách để làm điều này mà tôi có thể nghĩ ra từ đỉnh đầu của mình:

Tùy chọn 1:Điền vào một mảng mới với các giá trị chính từ tập dữ liệu, trong đó trọng số xác định tần suất một mục được lặp lại. Sau đó, tỷ trọng trong mảng này khớp với phân phối có trọng số. Chỉ cần lấy bằng $arr[array_rand($arr)] . Mặc dù đơn giản và dễ hiểu, nhưng điều này sẽ bùng nổ trước mặt bạn nếu có RẤT NHIỀU mặt hàng hoặc nếu giá trị trọng lượng thực sự cao.

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

Tùy chọn 2. Tính tổng các trọng số. Chọn một số ngẫu nhiên giữa 0 và tổng trọng số. Lặp lại các phần tử trong tập dữ liệu, so sánh với số ngẫu nhiên bạn đã chọn. Ngay sau khi bạn nhấn một chỉ số bằng hoặc lớn hơn chỉ số ngẫu nhiên, hãy chọn phần tử đó.

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

Theo dõi cuộc trò chuyện của chúng tôi trong phần nhận xét bên dưới, đây là một Pastebin với mã trong đó:

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. Làm cách nào để sử dụng MySQL thông qua XAMPP?

  2. 'TÙY CHỌN SQL_SELECT_LIMIT =DEFAULT'

  3. Nhập tệp .sql trong Access

  4. Có danh sách ký tự không được phép cho các tên cột của bảng mysql không?

  5. GROUP_CONCAT có giới hạn