rand()?

Status
Niet open voor verdere reacties.

Jori13

Gebruiker
Lid geworden
18 jan 2010
Berichten
159
Hoi,

Korte vraag. Ik heb de volgende code geschreven. Het probleem is echter dat rand() steeds de zelfde waardes aflevert als ik het programma start. Niet echt random dus. Kan iemand me helpen?

[CPP]#include <stdio.h>
#include <windows.h>
#include <stdlib.h>

int main(void)
{
int i, mediaan = RAND_MAX / 2, RND_NUMBER = rand() % RAND_MAX + 1;
int gelijk_counter = 0, kleiner_counter = 0, groter_counter = 0;

printf("%d\n\n", RAND_MAX); //36767 is de waarde van RAND_MAX.

for (i = 0; i < 500; i++)
{
if (rand() == mediaan)
{
gelijk_counter++;
}
else if (rand() < mediaan)
{
printf("%d ", rand());
kleiner_counter++;
}
else if (rand() > mediaan)
{
groter_counter++;
}
}

printf("Uitslagen:\n");
printf("Gelijk: %d, groter %d, kleiner %d", gelijk_counter, groter_counter, kleiner_counter);

Sleep(3000);
return 0;
}[/CPP]
 
Iets wat je zeker nooit mag vergeten als je programmeert:
Computers zijn Dom! (met hoofdletter D)

Het is zo dat een computer stiekem helemaal geen random getal kan 'kiezen'. De rand() functie haalt eigenlijk altijd het volgende getal uit een goed berekende wiskundige lijst. En de berekening voor die lijst ligt vast.
Als jij dan je programma laat lopen, dan haalt ie elke keer eerst het eerste getal op, dan het tweede, ..enz..

Hoe maak je iets dan 'echt' random?
Er bestaat een functie srand(long) waarmee je een zogeheten seed kan opgeven voor de rand-functie. Wanneer je een seed geeft, wordt die reeks met random getallen herberekend op basis van de seed.
Maar.. als die reeks op basis van de seed is, en mijn seed is altijd hetzelfde? Inderdaad, dan is je reeks dat ook.

Wat nu? Dan zorgen we er toch gewoon voor dat er altijd een ander getal als seed wordt gebruikt! Een random getal.. ahnee, want dat kunnen we nog niet maken :-P
Maar wat we bvb wel kunnen gebruiken is de huidige tijd van de pc waar je programma op draait. Afhankelijk van je systeem/codebibliotheek heb je functies om de tijd in seconden op te vragen, of in milliseconden, of het aantal processorticks, ...

Als je even zoekt op 'srand example' denk ik dat je vast wel een voorbeeld vind waarin ze de tijd gebruiken als seed. En aangezien je tijd normaal altijd anders is, is je seed dat ook. En als je seed altijd anders is, is de reeks die rand() gebruikt dat ook!
 
Heel erg bedankt voor je antwoordt :-) Maar zou je (of iemand anders) dat verhaal kunnen illustreren met een stukje voorbeeld code?
 
[cpp]srand(time(NULL));[/cpp]

Dit moet je eenmalig ergens in je programma zetten (voordat je "rand()" gebruikt) (mogelijk moet je nog "ctime" includen om het werkend te krijgen).
 
ik gebruik deze functie:

[CPP]
int randomNumb(int min, int max)
{
int seed = time(NULL);
srand(seed);
int ran=((rand()%max)+ min);
seed=ran;
return ran;
}[/CPP]

Het is aardig random, vooral als bijvoorbeeld de tijd tussen 2 random getallen genereren groter is dan ongeveer 1 seconde. Anders zie je nogal vaak hetzelfde getal omdat de functie dacht ik gebaseerd is op de tijd van de pc, en die veranderd elke seconde.
 
Het seeden hoef je dan meestal ook maar 1 keer te doen, helemaal aan het begin van je programma en niet in je functie.
 
Bedankt iedereen!

Ik heb nu deze code:
Hij lijkt nu iets meer random, maar hij is het nog steeds niet. Hoe kan dat?

[CPP]#include <stdio.h>
#include <windows.h>
#include <stdlib.h>

int main(void)
{
int i, mediaan = RAND_MAX / 2;
int gelijk_counter = 0, kleiner_counter = 0, groter_counter = 0;

srand(time(NULL));

printf("%d\n\n", RAND_MAX); //36767 is de waarde van RAND_MAX.


for (i = 0; i <= 500; i++)
{
if (rand() == mediaan)
{
gelijk_counter++;
}
else if (rand() < mediaan)
{
kleiner_counter++;
}
else if (rand() > mediaan)
{
groter_counter++;
}
}

printf("Uitslagen:\n");
printf("Gelijk: %d, groter %d, kleiner %d", gelijk_counter, groter_counter, kleiner_counter);

Sleep(3000);
return 0;
}[/CPP]
 
Laatst bewerkt:
Je bedoelt dat je zou verwachten dat ongeveer de helft groter is dan RAND_MAX / 2 en de helft kleiner?
Het probleem is dat je in je for-lus 3 keer een nieuw random getal opvraagt. Je kan beter een variabele aanmaken (ik hem hem "rnum" genoemd) en dan wordt je for-lus:
[cpp]for (i = 0; i <= 500; i++)
{
rnum = rand();
if (rnum == mediaan)
{
gelijk_counter++;
}
else if (rnum < mediaan)
{
kleiner_counter++;
}
else if (rnum > mediaan)
{
groter_counter++;
}
}[/cpp]

Bij mij is dan wel ongeveer de helft kleiner dan RAND_MAX / 2 en de helft groter.
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan