Avatar billede pcnovice Nybegynder
26. november 2003 - 10:40 Der er 14 kommentarer og
1 løsning

Random tal med forskellig sandsynlighed?

Er det muligt at vælge f.eks. 3 tal mellem 1 og 100, men hvor der er 10% chance for nummer 4, 23% chance for nummer 56 osv. Og for at gøre det hele lidt sjovere kan man så lave det således at jeg skal vælge 3 x 3 tal mellem 1 og 100 med forskellige procentsatser, og den en gang skal der være 2 under 50 osv.?
Avatar billede arne_v Ekspert
26. november 2003 - 10:54 #1
Lav et array med f.eks. 1000 elementer, hvis #4 skal have 10% chance
og #56 skal have 23% chance, så ligger du 4 ind i 100 pladser
og 56 ind i 230 pladser.

Så trækker du med:
  tabel[rng.nextInt(1000)]
Avatar billede arne_v Ekspert
26. november 2003 - 10:55 #2
2 under 50 ville jeg lave ved at smide væk indtil betingelsen var opfyldt.
Avatar billede stefanfuglsang Juniormester
26. november 2003 - 11:23 #3
Jeg tror jeg ville lave noget i stil med (pseudokode):

r0  = tilfældigt tal mellem 0 og 1; //vælger de forskellige tilfælde, 10%, 23% osv.
if (r0 < 0.1) // her er 10% chance for at havne
    r = tilfældigt tal mellem 0 og max1;
else if (r0 < 0.1+0.23) // her er 23% chance for at havne
    r = tilfældigt tal mellem min2 og max2;
else if (r0 < 0.1+0.23+0.33) //her er 33% chance for at havne
    r = tilfældigt tal mellem min3 og max3;
else // resten af tilfældende
    r = tilfældigt tal mellem min4 og max4;

ovenstående forudsætter at dine %'er er ens i flere intervaller, ellers bliver det for bøvlet.
Avatar billede stefanfuglsang Juniormester
26. november 2003 - 11:26 #4
øhh.. max1=min2, max2=min3, osv., ellers passer intervallerne ikke
Avatar billede stefanfuglsang Juniormester
26. november 2003 - 11:32 #5
og hvis du har yderligere betingelser, så gør som foreslået ovenfor, udtræk et nyt tal, hvis betingelsen ikke er opfyldt. Der er mere avancerede måder at gøre det på, men normalt vil det være godt nok at gøre sådan.
Det samme gælder, hvis alle udtrækninger skal være forskellige - træk et nyt tal, hvis der er trukket en "dublet" (teoretisk kunne det give en uendelig løkke, men i praksis er det ikke sandsynligt, med mindre du udtrækker mange tal, der skal være forskellige).
Avatar billede pcnovice Nybegynder
26. november 2003 - 11:52 #6
>stefanfuglsang

Du bliver lige nødt til at tage mig i hånden og så gå det igennem en gang! Lad os sige at vi får et 4 tal. altså r0 = 0.4 og hvad så?
Avatar billede stefanfuglsang Juniormester
26. november 2003 - 12:40 #7
Jeg forstår måske ikke dit spm., men tanken bag mit forslag - som skal omsættes til rigtig kode, naturligvis, er:
Få fat i et tilfældigt tal mellem 0 og 1, kald den r0.
r0 bruges til at vælge den rigtige if-sætning nedenunder.
Hvis r0 er 0.4, så springes første if over (0.4<0.1 er falsk)
Næste if-sætning springes også over (0.4 < 0.33 er falsk)
3. if-sætning udføres (0.4 < 0.66) - og det vil det gøre i 33% af tilfældende.
Jeg har brugt + mellem betingelserne, så du direkte kan se, hvad sandsynligheden er - det er det sidste tal i summen, f.eks.
0.33 er sandsynligheden i else if (r0 < 0.1+0.23+0.33)


hm... forklaringen er vist værre end koden?
Avatar billede stefanfuglsang Juniormester
26. november 2003 - 12:44 #8
Som jeg har forstået dit oprindelige spm. så er 10% chance for at få 4, blot et eksempel - jeg har gået ud fra at de 10% chance gælder for flere tal, f.eks. alle tal mellem 0 og 10, eller hvad du nu vil.

Hvis ikke den antagelse er rigtig, så må du prøve at uddybe dit spm.
Avatar billede stefanfuglsang Juniormester
26. november 2003 - 13:02 #9
et forsøg på en forklaring igen.
1. if-sætning dækker tilfældene fra r0 = 0 til 0.1 = 10% af tilfældene
2. if-sætning dækker tilfældene fra r0 = 0.1 til 0.33  = 23 % af tilfældene
3. if-sætning dækker tilfældene fra r0 = 0.33 til 0.66 = 33 % af tilfældene
else-sætning dækker resten: 1-0.1-0.23-0.33=0.33, dvs. resterende 33%
Avatar billede arne_v Ekspert
26. november 2003 - 14:02 #10
Har du overvejet min ide.

Det virker fortrinligt !
Avatar billede pcnovice Nybegynder
26. november 2003 - 20:46 #11
Jeg er med på din ide arne_v, men jeg er interesseret i at se om der er andre måder at gribe problemet an.

>stefanfuglsang
Alle tal mellem 1 og 100 har individuelle procentsatser, ikke noget med intervaller. Hvis der er, er det et tilfælde.
Avatar billede arne_v Ekspert
26. november 2003 - 20:50 #12
100 procent satser kan omregnes til 100 intervaller. Det virker.

Men jeg synes ikke at koden er køn (med så mange).
Avatar billede pcnovice Nybegynder
26. november 2003 - 20:54 #13
> arne_v
?
Avatar billede arne_v Ekspert
26. november 2003 - 21:00 #14
Lad os sige at vi kun havde 5 tal med fordeling 30% 30% 20% 10% 10%.

Jeg vill lave det med:

int[] table = { 1, 1, 1, 2, 2, 2, 3, 3, 4 5 };

og:

int v = table[rng.nextInt(10)];

Stefan vil lave det som:

double x = Math.random();
int v;
if(x<0.3) {
  v = 1;
} else if(x<0.6) {
  v = 2;
} else if(x<0.8) {
  v = 3;
} else if(x<0.9) {
  v = 4;
} else {
  v = 5;
}

samme effekt !
Avatar billede pcnovice Nybegynder
26. november 2003 - 21:20 #15
ja ok med 5 tal så er 0.1 og 0.2 begge lig 1, og de bliver sorteret fra efterhånden, for ellers var næsten alle tal < 0.9

ok I get it.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester