Hoi,
Voor ik begin, deze vraag is niet via google te zoeken, ik zou niet weten met welke zoektermen. Het is een niet zo algemeen probleempje.
Het probleem: ik wil een alternatief voor de random generator (van Borland c++builder) door gebruik te maken van data van www.random.org. Je kan van die server per dag een bepaald quota van random bits downloaden (een random bit is 0 of 1). Ik maak daarvoor op disk een bestand aan met random bytes.
Maar hoe bereken je nu een random getal tussen 0 en n uit die bytes?
Ik had eerst dit (de code is niet letterlijk maar je begrijpt een beetje wat ik wilde):
Deze code gebruikt echter voor een getal > 512 al 3 bytes, dus klopt niet helemaal.
Ik moet dus waarschijnlijk iets met bitshifting of vermenigvuldigen doen, maar ik kom er niet uit.
Alvast bedankt. Ben benieuwd.
Edit:
Ik wil de range wel beperken tussen 0 en MAX_INT, dan heb ik dus per getal 1 tot 4 bytes nodig.
0-255 1 byte
0-65535 2 bytes
etc.
Kan ik het gevonden getal in die range dan 'gewoon' modulus 'n' doen?
Voor ik begin, deze vraag is niet via google te zoeken, ik zou niet weten met welke zoektermen. Het is een niet zo algemeen probleempje.
Het probleem: ik wil een alternatief voor de random generator (van Borland c++builder) door gebruik te maken van data van www.random.org. Je kan van die server per dag een bepaald quota van random bits downloaden (een random bit is 0 of 1). Ik maak daarvoor op disk een bestand aan met random bytes.
Maar hoe bereken je nu een random getal tussen 0 en n uit die bytes?
Ik had eerst dit (de code is niet letterlijk maar je begrijpt een beetje wat ik wilde):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| int random(n) { unsigned char num = 0; for (int i = 0; i < n / 256; i++) { fread(&num, 1, 1, randdata); m += num; } int p = n % 256; if (p) { fread(&num, 1, 1, randdata); m += num % p; } return m; } |
Deze code gebruikt echter voor een getal > 512 al 3 bytes, dus klopt niet helemaal.
Ik moet dus waarschijnlijk iets met bitshifting of vermenigvuldigen doen, maar ik kom er niet uit.
Alvast bedankt. Ben benieuwd.
Edit:
Ik wil de range wel beperken tussen 0 en MAX_INT, dan heb ik dus per getal 1 tot 4 bytes nodig.
0-255 1 byte
0-65535 2 bytes
etc.
Kan ik het gevonden getal in die range dan 'gewoon' modulus 'n' doen?
[ Voor 8% gewijzigd door Anoniem: 302117 op 22-04-2012 20:34 ]