Help - Zoeken - Gebruikers - Kalender
Volledige versie: Random getal in C++
MandrivaClub.NL > Forum > Documentatie en Programmeren
PiLotCoptEr
Ok, ik ben dus ongeveer net bezig met C++, en heb al verschillende tutorials afgezocht, maar ik heb nog niet iets gevonden om een random getal te genereren en aan een integer toe te wijzen. Weet iemand hoe dat moet?

In Qbasic was het geloof ik:

...
RANDOMIZE
LET Variabele = INT(RND * TotBepaaldGetal)
...
boudewijn
Jups, das QBasic....

Als je het in C++ wil doen is het een tikkie moeilijker (leuk idee; schrijf er een class voor smile.gif ):


je moet <cmath> en <ctime> includen. Nu moet je een seed aanmaken voor de randon number generator (rng)... dit is het leukste te doen door de tijd te gebruiken. Daarom hebben we ook ctime meegenomen, de tijd is namelijk altijd een andere seed. Deze tijd kunnen we achterhalen door time() aan te roepen met als parameter 0. Dit zorgt er nml voor dat we seconden terug krijgen....

Okay de seed kun je zo zetten:

CODE
srand ( time(0))


Nu je dit hebt gedaan kun je de rng gaan gebruiken.

CODE
int x = rand()


vult de interger x met een getal in de int waarde [0 tot 2^16-1], en dan kun ej die int uitlezen.

Let op die waarde is een uint :!:

Ik zal zo nog wel even een class posten die dit doet smile.gif
PiLotCoptEr
:shock: Ow het is zoo moeilijk?
Waar moet ik al die artifact-dingen plaatsen dan?

CODE
#include <iostream.h>

#include <cmath.h>

#include <ctime.h>



// Dan int ik het programma..



int main()

{



// Gooi ik dan hier dat srand ding neer?

// en hier int x =rand() ?



}
boudewijn
CODE
#include <ctime>

#include <cmath>

#inlcude <iostream>



void main()

{

   //maak seed aan...

   srand(time(0));

   

  cout<< "willekeurig getal="<<rand()<<endl;





}


Dit geeft een willekeurig getal aan in een bereik van 0 tot een maximale waarde. Deze maximale waarde is compiler specifiek, en kan op worden geroepen met 'RAND_MAX'

Als je dus je random getal een bereik wil geven tussen de 0 en de 1 doe je het volgende:

CODE


double random= rand()/RAND_MAX;


Je kunt nu met de volgende formule de bounds aangeven, aangenomen dat je je ondergrens minBound en je bovengrens maxBound noemt.

CODE


double random= rand()/RAND_MAX;

long result= ceil( random*maxBound)+minBound;



Nu geldt: minBound<=result<=maxBound

Let wel op dat dit omhoog afrondt, als je dit nauwkeuriger wil doen zul je even een afrond functie moeten schrijven (dat kan makkelijk met modulo, en floor() (floor rondt omlaag af )). 8)
boudewijn
De beloofde class.

CPP file
CODE




//Gemaakt door Boudewijn Ector voor www.mandrakeclub.nl







#include "randomnumgen.h"



#include <ctime>

#include <cmath>





randomNumGen::randomNumGen(void)

{

this->refreshGenerator();

return;

}



randomNumGen::~randomNumGen(void)

{

}



long randomNumGen::getNext(long minBound, long maxBound)

{

long result=rand();

//result*=maxBound;

double temp=((double)result)/RAND_MAX;

result= (long) (temp*(double)(maxBound-minBound));

       //de double cast zorgt ervoor dat het niet een

       //long=Long*long wordt, maar een double=double*double

//als de compiler nml een implicit cast uitvoert op temp, dan wordt het afgerond (op 0 of 1)

result+=minBound;

return (result);

}



void randomNumGen::refreshGenerator(void)

{

srand(time(0));

// ik heb deze code niet direct in de constructor gezet, zodat we het nu nog aan kunnen

       //roepen zonder het object te re-initialisen!

return;

}




En de header file:

CODE




//Gemaakt door Boudewijn Ector voor www.mandrakeclub.nl



#pragma once



class randomNumGen

{

public:

randomNumGen(void);

~randomNumGen(void);

long getNext(long minBound, long maxBound);

void refreshGenerator(void);

};  



Include de header file (ik heb hem randonnumgen.h genoemd) in je project, en je kunt beginnen.

Mail mij voor vragen en of commentaar (op het forum posten mag ook smile.gif )
PiLotCoptEr
:? Ok.. het duizelt mij allemaal even...

Wat kan ik met die ^^^ stukjes code doen?
boudewijn
Nou die eerste post, is een simpele uitleg
Die 2 post is een class; header en cpp smile.gif
Alain
Boudewijn, heb je dit wel in linux met g++ geprobeerd?
boudewijn
Heel eerlijk gezegd niet, ik heb het met Visual Studio .NET 2003 (ja, legaal :wink: ) geprobeerd. En daar werkte het.


Ik wacht met mijn eigen pc nog steeds op een fatsoenlijke amd64 versie van mandrake 10.....


Als er overige problemen mochten zijn hoor ik het wel!
PiLotCoptEr
Ok... iig bedankt, ik klooi wel even wat aan ;).gif
Alain
CODE
#include "StdAfx.h"


Ik weet niet wat dit is, maar mijn compiler geeft hier de melding dat het bestand niet gevonden is.

CODE
#include ".randomnumgen.h"


Wat doet die . daar :?? (Dat is toch windows taal?)

Verder compileert hij niet omdat ie de functie rand() niet kan vinden. (Die zal ongetwijfeld in StdAfx staan ...)
boudewijn
Nope,

stadafx is een filetje in je project waarin je alle headers include....


Hmm dan iets anders:
probeer in de class die gebrui maakt van de randomNumberGen eens de header te includen, dat gaat dan zo:
CODE
#include "randomnumgen.h"


Ik heb de header en de cpp aangepast :wink:
Alain
Euhm, ik krijg nog steeds undefined reference to rand(). Ik heb het even uitgezocht en rand() zit in stdlib.h (libc).

Het volgende is danwel zonder class, maar het is even om aan te geven hoe het werkt:

CODE
#include <stdlib.h>

#include <iostream.h>



int main ( void )

{

cout <<  rand() << endl;

return 0;

}


Het probleem bij deze functie is dat hij aan de start van het programma elke keer dezelfde waarde retouneert. Dit is op te lossen door de (void) functie srand(uint) aan te roepen. Door srand() bijvoorbeeld de huidige tijd mee te geven levert rand() wel een random waarde op (nou ja, min of meer). Het ziet er dan als volgt uit:

CODE
#include <stdlib.h>

#include <iostream.h>

#include <time.h>



int main ( void )

{

srand(time(0));

cout <<  rand() << endl;

return 0;

}


Dit is allemaal getest met me Mandy. ;-)
boudewijn
Als je nu die stdlib.h gaat includen in die class, zal het wel werken. Ik beschik vanavond (met wat geluk) ook over een testmachine!
PiLotCoptEr
Ok Boudewijn, fijn dat je me het hebt uitgelegd op MSN ;).gif

Kun je me ook nog vertellen hoe dat zit met die min en maxBound?
boudewijn
Uhm,


Ik heb die minBound en maxBound er voor je bijgezet, zodat je kunt bepalen in welk bereik de willekeurige getallen uitkomen.

Normaal is dat (bij de meeste compilers) ergens tussen de 0 en de RAND_MAX. Als je echter die uitkomst deelt door RAND_MAX krijg je een getal groter dan 0 en kleiner dan 1.

Wanneer je dit getal vermenigvuldigt met (maxBound-minBound) en dan bij het resultaat optelt krijg je een getal waarvoor gedlt:

minBound<=getal<=maxBound
PiLotCoptEr
Aha... dus als ik een getal tussen 0 en 7 wil (dus 1 t/m 6), hoe de ik dat dan :oops:?
boudewijn
Je moet dan minBound op 1 zetten en maxBound op 6.
PiLotCoptEr
Dat snap ik... maar hoe prop ik dat dan in het programma:

CODE


#include <iostream.h>

#include <cmath>

#include <ctime>



int main()



{

srand(time(0));

int gtl = rand();

cout << gtl << endl;

return 0;

}

boudewijn
Je neemt een programma,
je include daar de header file
je maakt een class aan van het type randomNumGen
en vervolgens roep je gewoon die member-functie aan....
boudewijn
Snap je hem nu?
PiLotCoptEr
Eeh, ik geloof het wel smile.gif Ik bekijk het allemaal wel een keer rustig, ik ben du best wel druk.
Dit is een "Print" versie van onze forums. Om de volledige versie met meer informatie, afbeeldingen en opmaakte bekijken, a.u.b. klik hier.