Random getallen

Status
Niet open voor verdere reacties.

MeesterDaan

Gebruiker
Lid geworden
20 mrt 2007
Berichten
11
Hallo,

Heeft iemand weleens bekeken hoever een randomfunctie afwijkt van een uniforme kansverdeling?

Dus als ik honderd keer srand(100) aanroep en ik sorteer de resultaten, krijg ik dan 0, 1,2,3,4,5 ... 99 of daar een afwijking van? En hoeveel?

Daan
 
Allereerst zul je rand() moeten gebruiken.
Met srand() zet je de seed ('startwaarde') voor de random generator. Als je 100 keer srand() aanroept gebeurt er euh.. niets!

Nu even terug naar de vraag. Bij een professionele C++ implementatie zal er echt wel een behoorlijke random generator inzitten. Maar 100 keer rand() aanroepen zal niet alle getallen in het bereik 0..99 precies 1 keer opleveren. En 100 keer hetzelfde programma draaien zal iedere keer dezelfde random reeks opleveren (tenminste, als je srand() elke keer met dezelfde parameter aanroept of juist niet aanroept).

Ofwel: Je krijgt een redelijk goede random reeks maar echt niet ieder mogelijk antwoord precies even vaak.
 
-> (Met excuus voor eerdere typo)


Inderdaad Palmpje, als ik 100 random getallen genereer wijkt het altijd iets af van de uniforme verdeling.

Maar als ik dat nou tien keer doe, wijkt het dan tien keer op dezelfde manier af, of tien keer op een andere manier? Dat is belangrijk, zeker voor AI of wetenschappelijke software.

Daar zou ik graag jullie ervaringen over willen horen (als die er zijn).

Daan
 
Zo snel lezend denk ik dat de uitkomsten vooral op je seed berusten, meestal wordt geloof ik time() gebruikt srand(time())
 
#include <iostream>
#include <ctime> // voor time()
#include <cstdlib> //voor srand() and rand()
using namespace std;

int main()
{
srand(time(NULL));
for(int i=0; i < 100; i++)
{
cout << (rand() % 100) + 1 << endl;
}
return 0;
}

srand gebruikt als seed de system clock.
rand function returns een "random" positive integer van 0 tot een large value (zeker tot 32767) elke keer als het aangeroepen wordt. Met % 100 geef je aan tot hoever hij moet kijken.

time(NULL) returns het aantal seconds verlopen sinds 00:00, Jan 1, 1970 UTC (system clock).
(Epoch time)

Succes
Boldyman
 
Nog even een reactie.

In veel gevallen wil men bij simulaties JUIST dat de volgende keer ook dezelfde "random" reeks getrokken wordt. Op die manier zou je bijvoorbeeld het gedrag van 2 systemen kunnen vergelijken.

In het algemeen kun je stellen dat een random generator in zoiets als Visual C++ van een redelijk hoge kwaliteit is. Bij 100 trekkingen zal de variantie nog redelijk groot zijn. Pas bij duizenden trekkingen mag je iets verwachten dat op een uniforme verdeling lijkt.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan