kansberekening in c++

  • Onderwerp starter Onderwerp starter ceke
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

ceke

Gebruiker
Lid geworden
9 mrt 2007
Berichten
86
hoi, ik zou graag een soort dobbelsteen maken.
De kans moet dan wel 1 op 6 zijn dat ik een bepaald getal (bv. 6) gooi;)
Hoe laat ik dit c++ doen?

alvast bedankt, :thumb:

ceke
 
Ik weet niet goed hoe ik het je moet uitleggen zonder je vraag al helemaal op te lossen, dus hier komt een voorbeeldprogramma: 10 keer gooien met 1 dobbelsteen
Ik heb een hele hoop commentaar toegevoegd
Code:
#include <iostream>  //cin, cout, cin.get(), endl
#include <cstdlib>  //rand(), srand()
#include <ctime>   //time()
using namespace std;  //cin/cout ipv std::cin/std::cout

//de mainfunctie = het programma dat wordt uitgevoerd
int main()
{
//een basiswaarde voor de 'random' getallenreeks vastleggen
//de randomfunctie berekent eigenlijk een reeks getallen volgens een wiskundige formule
//met srand kan je een andere reeks bekomen (srand = seed random)
//hier heb ik als basiswaarde de huidige systeemtijd in seconden genomen (time(0)), voor de meeste
//gevallen zal dit volstaan, maar niet als je programma meerdere malen per seconde moet
//uitgevoerd worden
//probeer maar eens om bvb srand(5) te gebruiken, en je zal altijd dezelfde getallenreeks krijgen
    srand(time(0));
//alles binnen de forloop 10 keer uitvoeren
    for (unsigned short i = 0; i < 10; i++){
          //weergeven de hoeveelste keer we in de lus zijn en de berekende random waarde tonen
          //de rand() functie geeft het volgende geheel getal in de randomreeks weer
          //daarvan nemen we de rest van deling door 6, zo is het resultaat nu enkel een getal
          //van 0 tem 5. Daar tellen we 1 bij, want een dobbelsteen gaat van 1-6
          //endl is de code die ervoor zorgt dat de er een nieuwe lijn wordt gestart in de output
          cout << "getal " << i+1 << " = " << rand()%6 + 1 << endl;
    }
    cin.get();  //wachten op een toets
    return 0;  //programma werd afgewerkt zonder fouten
}

Hopelijk heb je hier wat aan,
--Johan
 
Ik weet niet goed hoe ik het je moet uitleggen zonder je vraag al helemaal op te lossen, dus hier komt een voorbeeldprogramma: 10 keer gooien met 1 dobbelsteen
Ik heb een hele hoop commentaar toegevoegd
Code:
#include <iostream>  //cin, cout, cin.get(), endl
#include <cstdlib>  //rand(), srand()
#include <ctime>   //time()
using namespace std;  //cin/cout ipv std::cin/std::cout

//de mainfunctie = het programma dat wordt uitgevoerd
int main()
{
//een basiswaarde voor de 'random' getallenreeks vastleggen
//de randomfunctie berekent eigenlijk een reeks getallen volgens een wiskundige formule
//met srand kan je een andere reeks bekomen (srand = seed random)
//hier heb ik als basiswaarde de huidige systeemtijd in seconden genomen (time(0)), voor de meeste
//gevallen zal dit volstaan, maar niet als je programma meerdere malen per seconde moet
//uitgevoerd worden
//probeer maar eens om bvb srand(5) te gebruiken, en je zal altijd dezelfde getallenreeks krijgen
    srand(time(0));
//alles binnen de forloop 10 keer uitvoeren
    for (unsigned short i = 0; i < 10; i++){
          //weergeven de hoeveelste keer we in de lus zijn en de berekende random waarde tonen
          //de rand() functie geeft het volgende geheel getal in de randomreeks weer
          //daarvan nemen we de rest van deling door 6, zo is het resultaat nu enkel een getal
          //van 0 tem 5. Daar tellen we 1 bij, want een dobbelsteen gaat van 1-6
          //endl is de code die ervoor zorgt dat de er een nieuwe lijn wordt gestart in de output
          cout << "getal " << i+1 << " = " << rand()%6 + 1 << endl;
    }
    cin.get();  //wachten op een toets
    return 0;  //programma werd afgewerkt zonder fouten
}

Hopelijk heb je hier wat aan,
--Johan

Beste Johan

Alvast zeeeeer bedankt voor je reactie en de moeite:thumb:
Maar zou je aub je comentaar een beetje willen ordenen want ik snap er eigenlijk
niks van in deze volgorde:confused:
sorry hoor:shocked:
ps. zit endl in iostream? Het is toch gewoon een achtervoegsel van cout.
Alvast zeer bedankt:thumb:

ceke
 
Laatst bewerkt:
endl is een achtervoegsel maar wordt toch gezien als een functie uit iostream
 
mijn random functie:

Code:
int GetRandNR( BOOL mayrtrn0, const int low = 1, const int high = 6  );
int GetRandNR( BOOL mayrtrn0, const int low, const int high )
    {
    int number = 0;

    if( mayrtrn0 )
        {
        time_t seconds;
        time(&seconds);
        srand(seconds+rand()-(rand() % (high - low + 1) + low));
        number = rand() % (high - low + 1) + low;
        return number;
        }
    else
        {
        while ( number < 1 && number > -1 )
            {
            time_t seconds;
            time(&seconds);
            srand(seconds+rand()-(rand() % (high - low + 1) + low));
            number = rand() % (high - low + 1) + low;
            }
        return number;
        }
    }

ZO AAN TE ROEPEN
int thisroll;
thisroll = GetRandNR( false );

je moet time.h includen

resultaat van een paar duizend rolls:

one: 3246
two: 3328
three: 3491
four: 3227
five: 3439
six: 3375
 
Code:
(rand() % (high - low + 1) + low));

rand() % (high - low + 1) + low == rand() % high + 1;
 
een verklaring van je post en waar je op doelt zou erg handig zijn
 
Ik vroeg me gewoon af waarom je er eerst 1 aftrekt en daarna weer 1 optelt. (in het geval van deze dobbelsteen in ieder geval :P)
 
Ik vroeg me gewoon af waarom je er eerst 1 aftrekt en daarna weer 1 optelt. (in het geval van deze dobbelsteen in ieder geval :P)

Jouw formule houdt geen rekening met de minimale waarde, al is dat inderdaad niet belangrijk met een dobbelsteen.
 
dit is mijn random nummer functie dus je kunt hem gebruiken als een dobbelsteen en dan is minium 1 en maximum 6 maar je kunt hem ook ergens anders voor gebruiken als je bv een getal tussen 100 en 200 wilt hebben of tussen -6 en +6

1 term:
reusable code
 
Laatst bewerkt:
Eigenlijk is deze functie te klein om in een functie te zetten...
 
vind ik niet, het is een stuk code dat je vaak nodig hebt dus liever een keer een functie maken dan steeds dit blok code te plakken waar je het nodig hebt. zet het gewoon bij je andere standaard functies dan zie je het nieteens staan
 
nummer = (rand() % (max-min)) + min;



niet echt sprake van een "blok" code dacht ik :cool:
 
Je zou er ook makkelijk een macro van kunnen maken.

Code:
#define RANDOM(LOW, HIGH)  (rand() % (HIGH - LOW + 1)) + 1

int nummer = RANDOM(LOW, HIGH);  // -> GetRandNR(true)

while(nummer < 1 && nummer > -1) nummer = RANDOM(LOW, HIGH); // -> GetRandNR(false)

Qua resultaat maakt het verder niks uit.
 
Je zou er ook makkelijk een macro van kunnen maken.

Code:
#define RANDOM(LOW, HIGH)  (rand() % (HIGH - LOW + 1)) + 1

int nummer = RANDOM(LOW, HIGH);  // -> GetRandNR(true)

while(nummer < 1 && nummer > -1) nummer = RANDOM(LOW, HIGH); // -> GetRandNR(false)

Qua resultaat maakt het verder niks uit.

Of inline van maken, dan werkt die 3e parameter weer.
 
Sorry voor een tijd niet gereageerd te hebben.
Ik heb alle reacties bekeken en snap het nu een beetje beter:thumb:
Er zijn wel veel manieren he:confused:
Welke is eigenlijk de beste?
 
de beste? allemaal. ligt aan je prioriteiten verklaar wat JIJ het best vind
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan