Random nummers

Status
Niet open voor verdere reacties.

manhaeve5

Gebruiker
Lid geworden
9 jan 2007
Berichten
276
Ik heb nu cstdlib gebruikt met srand(time(0)) voor random numbers te genereren, maar het cijfer stijgt 1 per seconde, is er een manier om dit meer te doen verschillen?

Greetzzzz
Hypeion
 
Ja, hij doet precies wat je vraagt.

srand() zet de startwaarde van de random generator.
Probeer maar een reeks rand() aanroepen te doen.
 
een random-getal in programmertermen is nooit echt 'random'. Er schuilt namelijk een reeks wiskundige formules achter een random-functie. In veel talen (waaronder C++) maken die wiskundige formules gebruik van een startwaarde (in het engels een 'seed' genoemd). Als je altijd met dezelfde seed werkt, zal je ook altijd dezelfde reeks getallen krijgen.

Een voorbeeld in C++: srand() wordt gebruikt om de seed te zetten, rand() om een random getal te genereren.
We gaan een reeks van 10 getallen tussen 0 en 10 maken
Code:
#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
    srand(0);
    for (unsigned short i = 0; i < 10; i++){
          cout << "getal " << i+1 << " = " << rand()%11 << endl;
    }
    cin.get();
    return 0;
}
Als je dit programma enkele keren uitvoert zal je zien dat je altijd dezelfde reeks krijgt (bij mij:)
Code:
5 8 8 6 0 5 5 0 0 10

Hoe los je zoiets dan op? Door de seed in te stellen op de seconde dat het programma wordt opgestart bvb. Zo krijg je elke keer men het programma start (tenzij het meer dan 1 keer per seconde wordt gestart) een andere seed, en dus een andere reeks.

Voorbeeld: voorgaande code aangepast. Enkel de lijn van de seed is gewijzigd en de header voor het gebruik van de tijdsfunctie is geïncluded
Code:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    srand(time(0));
    for (unsigned short i = 0; i < 10; i++){
          cout << "getal " << i+1 << " = " << rand()%11 << endl;
    }
    cin.get();
    return 0;
}

Als je programma echter meerdere keren per seconde moet gestart worden, kan je overwegen om ipv met time(0) te seeden, een preciezere methode te implementeren (bvb dmv milliseconden/clockcycles) Deze methodes vallen echter buiten de STL, dus zal ik ze hier niet uitleggen. Indien je er toch in geïnteresseerd bent raad ik je aan om even naar GetTickCount() te kijken (in "Windows.h"), of naar de Boost Random Number Library

--Johan
 
zet je de status van de vraag dan nog even op opgelost ?

--Johan
 
Nog even terugkomend.

In heel veel applicaties is het juist gewenst om altijd dezelfde reeks 'random' trekkingen te krijgen. Het gaat dan niet om de random trekking op zich maar om het gedrag van verschillende gesimuleerde systemen. Die moeten dan wel ieder dezelfde invoer krijgen. Denk bijvoorbeeld aan klanten bij een supermarkt. Hoe snel worden de klanten geholpen bij een gegeven beleid voor het openen van kassa's.
In dat soort gevallen is het belangrijk dat het aanbod (hoeveel mensen komen bij de kassa's in de rij staan) gelijk blijft. Op die manier kan bekeken worden welke strategie (lees: aantal kassa's open bij gegeven drukte) het beste werkt. [Nadeel: klanten die zien dat de rij lang is schuiven misschien in de praktijk niet meteen aan maar 'browsen' nog even, als het even rustig is snelt iedereen naar de kassa.... lastig te ondervangen in simulaties].

Naar de kern van het probleem: Met srand() zet je de startwaarde van een reeks, met rand() vraag je steeds de volgende semi-random uitkomst in die reeks. Een beetje respectabele compiler/library heeft een dermate goede random-generator dat de getrokken reeks ook de karakteristieken van een echte random reeks heeft.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan