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
Generalsz 1-100 tartomanyban, majd az (1,60) tartomanyban 6-al osztasz, a (60,90) tartomanyban (x-60)/2+10 keplettel normalod a celtartomanyra, es igy tovabb.
Masik megoldas, hogy ha a 10-es tartomanyokon belul nem egyenletes eloszlas kell, akkor illeszthetsz harmadfoku fuggvenyt a megadott ertekekre.
Szerintem ez 2 generálás lesz. Az elsővel meghatározod melyik intervallumból fogod a másikat generálni, ami a végeredmény lesz.
Az első generálás úgy nézne ki, hogy generálsz egy random számot 0 és 1 között, legyen ez x.
- Ha x<0.6, akkor az első intervallumból fogod a második generálást futtatni.
- Ha x<0.8 (60+20%), akkor a másodikból.
- Ha x<0.95, akkor a harmadikból.
- Különben a negyedikből.
Találj ki határokat.
5% a legkisebb, akkor dolgozhatunk 100-as számmal. Generálj egy random számot 1-100 között, ez mondja meg melyik tartományba fog esni a random számod.
Ha 1-60 között, akkor 1-10 között generálj randomot.
Ha 61-80 között, akkor 11-20 között generálj neki.
Ha 81-95 között, akkor 21-30, 96-100 pedig a 31-40 közötti random generálást kell, hogy csinálja.
Nem tudom van-e szebb megoldás, de ez első ránézésre is könnyen érthető.
#2 vagyok
Megköszönnék egy indoklást a véreskezűtől, hogy tanuljak belőle.
"random számot 0 és 1 között"
"Ha x<0.95, akkor a harmadikból.
Különben a negyedikből."
Ebből 6% lesz 5 helyett.
0,95
0,96
0,97
0,98
0,99
1
Válaszoltam miért kaphatott lepontozást (nem tőlem).
A kérdést nem azért tettem fel mert nem tudtam megoldani, hanem mert más megoldására is kíváncsi voltam.
Termeszetesen van elonye, hogy nem kell 2 random szamot generalni. A rand() draga C-ben, jobban megeri szorozni-osztani.
A fuggvenyes dolog meg valoban hulyeseg.
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!