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 đó: