sql >> Database teknologi >  >> RDS >> Mysql

vælg tilfældig værdi baseret på sandsynlighed chance

Du kan gøre dette ved at bruge rand() og derefter bruge en kumulativ sum. Forudsat at de tæller op til 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;

Bemærkninger:

  • rand() kaldes én gang i en underforespørgsel for at initialisere en variabel. Flere kald til rand() er ikke ønskelige.
  • Der er en lille chance for, at det tilfældige tal vil være nøjagtigt på grænsen mellem to værdier. limit 1 vælger vilkårligt 1.
  • Dette kunne gøres mere effektivt ved at stoppe underforespørgslen, når cumep > @r .
  • Værdierne behøver ikke at være i nogen bestemt rækkefølge.
  • Dette kan ændres til at håndtere chancer, hvor summen ikke er lig med 1, men det ville være et andet spørgsmål.



  1. Antal gange et bestemt tegn optræder i en streng

  2. Database ikke konfigureret laravel under migrering

  3. OPDATERE flere tabeller i MySQL ved hjælp af LEFT JOIN

  4. Hent data fra krydstabel i Yii2