Du kan göra detta genom att använda rand()
och sedan använda en kumulativ summa. Förutsatt att de summerar till 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;
Anmärkningar:
rand()
anropas en gång i en underfråga för att initiera en variabel. Flera anrop tillrand()
är inte önskvärda.- Det finns en liten chans att slumptalet ligger exakt på gränsen mellan två värden.
limit 1
väljer godtyckligt 1. - Detta kan göras mer effektivt genom att stoppa underfrågan när
cumep > @r
. - Värdena behöver inte vara i någon speciell ordning.
- Detta kan modifieras för att hantera chanser där summan inte är lika med 1, men det skulle vara en annan fråga.