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
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