Anda dapat melakukan ini dengan menggunakan rand()
dan kemudian menggunakan jumlah kumulatif. Dengan asumsi mereka menambahkan hingga 100%:
select t.*
from (select t.*, (@cumep := @cumep + chance) as cumep
from t cross join
(select @cumep := 0, @r := rand()) params
) t
where @r between cumep - chance and cumep
limit 1;
Catatan:
rand()
dipanggil sekali dalam subquery untuk menginisialisasi variabel. Beberapa panggilan kerand()
tidak diinginkan.- Ada kemungkinan kecil bahwa bilangan acak akan tepat berada pada batas antara dua nilai.
limit 1
sewenang-wenang memilih 1. - Ini dapat dibuat lebih efisien dengan menghentikan subquery ketika
cumep > @r
. - Nilai tidak harus dalam urutan tertentu.
- Ini dapat dimodifikasi untuk menangani peluang di mana jumlahnya tidak sama dengan 1, tetapi itu akan menjadi pertanyaan lain.