Hogyan lehet így C++ random számot generálni?
1-10 60% esély
11-20 20% esély
21-30 15% esély
31-40 5% esély
Nem kell nagyon filózni azon hogy kit miért pontoznak le az anonymok, vannak emberek akik szeretik nyomkodni a piros kezet, sokszor ok nélkül.
Ami pedig a válaszokat illeti: Az #1-es a leghatékonyabb és a véleményem szerint a legelfogadhatóbb, a #2, #3-as viszont sokkal olvashatóbb, egyszerűbb, de 2x kell generálni számot az elégséges 1 helyett. Akkora nagy sebességbeli különbségnek azért nem kéne lennie a 2 megoldás között.
De az #1-es válaszban több elírás is van (lehet hogy ezért a lepontozás vagy a magyarázat hiánya miatt):
A példa tartomány nem 60-90 hanem 61-80 (vagy én nem értek valamit), a végén pedig felfelé kéne kerekíteni akkor, ha így választjuk meg a tartományokat. Jobb ha lefelé kerekítünk, a tartomány így 0-99 és a végén 1,11,21,31-et adunk hozzá, így egy egészosztással megússzuk.
Másik probléma hogy még így sem jó a résztartományon belüli eloszlás: hogy működjön, olyan tartományt kell választani, hogy a normalizálás során a résztartományoknak egész osztója legyen a normalizált tartományok méretének. Pl itt van olyan hogy 15 számot normalizálunk 10 darabra, lehet látni hogy lesz olyan szám amire 2 szám fog jutni, így 2x akkora esélye lesz mint az olyannak amire csak 1. Ha 30 számot normalizálnánk 10-re, minden számra pontosan 3 másik jutna.
A módszer:
Generáljunk [0,199] tartományban egy x számot.
Ha x = {0...119}, akkor a random szám (x-0)*10/(60*2)+1=(x+12)/12,
ha x = {120...159}, akkor a random szám (x-120)*10/(20*2)+11=(x-76)/4,
ha x = {160...189}, akkor a random szám (x-160)*10/(15*2)+21=(x-97)/3,
ha x = {190...199}, akkor a random szám (x-190)*10/(5*2)+31=x-159.
#12
Kb kétszer gyorsabb a megoldásod, mint a másik. Ha sok számra van szükség akkor megéri használni a te leírásod alapján. (Sok alatt több mint 1 milliót értek mert annyit milliszekundumok alatt legenerál a gép, és tömbbe dobálja őket)
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!