[C++] Probleem met random.

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • JordyOnrust
  • Registratie: November 2007
  • Laatst online: 10-07 13:02

JordyOnrust

Leef om te leven.

Topicstarter
Beste mensen,

Ik ondervind wat problemen met het genereren van random getallen in C++.
Mijn bedoeling is het ontwikkelen van een soort Yahtzee game.
Binnen deze game heb ik een class Dobbelsteen, welke een random getal kan genereren tussen 1 en 6.

De class Yahtzee maakt 5 objecten van Dobbelsteen aan, en met een for-loop roep ik van elke dobbelsteen een methode aan voor het genereren van een random getal.

Zie onderstaande code.

C++: Constanten.h
1
2
3
4
5
6
7
#ifndef CONSTANTEN
#define CONSTANTEN

const int NUMBER_ON_DICE = 6;
const int NUMBER_OF_DICES = 5;

#endif

C++: Dobbelsteen.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef DOBBELSTEEN
#define DOBBELSTEEN

#include "Constanten.h"
#include <cstdlib>
#include <ctime> 

class Dobbelsteen
{
  public:
     // Getal dat de dobbelsteen aanwijst.
     int gegooid;
     int gooiDobbelsteen();
};

#endif

C++: Dobbelsteen.cpp
1
2
3
4
5
6
7
8
9
10
#include "Dobbelsteen.h"

using namespace std;

int Dobbelsteen::gooiDobbelsteen()
{
     srand((unsigned)time(0));    
     this->gegooid = rand()%NUMBER_ON_DICE + 1;
     return this->gegooid;
}

C++: Yahtzee.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef YAHTZEE
#define YAHTZEE

#include "Constanten.h"
#include "Dobbelsteen.h"
#include <cstdlib>

class Yahtzee
{
     private:
          Dobbelsteen* dobbelstenen[NUMBER_OF_DICES];
     public:
          Yahtzee();
          void gooiDobbelstenen();
};

#endif

C++: Yahtzee.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "Yahtzee.h"
#include <iostream>

using namespace std;

Yahtzee::Yahtzee()
{
     for(int i = 0; i < NUMBER_OF_DICES; i++)
     {
          Dobbelsteen* dobbelsteen = new Dobbelsteen();
          dobbelstenen[i] = dobbelsteen;
     }
}

void Yahtzee::gooiDobbelstenen()
{
     for(int i = 0; i < NUMBER_OF_DICES; i++)
     {
          int blaat = dobbelstenen[i]->gooiDobbelsteen();
          cout << blaat << endl;
     }
     cin.get();
}

C++: Game.cpp
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include "Yahtzee.h"

using namespace std;

int main()
{
     Yahtzee yahtzee;
     yahtzee.gooiDobbelstenen();
}


Wat mijn probleem met bovenstaande code nou is, is dat ik bij het genereren van dus 5 keer een random getal 5 keer het zelfde getal terug krijg.

Ik zou niet weten hoe ik dit zou kunnen oplossen.

Heeft iemand een idee?

Als je sterft voordat je sterft, sterf je niet wanneer je sterft. Rom 6:5


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Je hoeft srand maar een keer aan te roepen in plaats van iedere keer dat je rand aanroept.

Acties:
  • 0 Henk 'm!

  • kunnen
  • Registratie: Februari 2004
  • Niet online
De seed (srand) zorgt ervoor dat je random-functie op een bepaalde plek begint. Nu geef je hem steeds dezelfde plek mee (namelijk de huidige tijd), dus hij geeft ook steeds hetzelfde getal.

Oplossing is hierboven genoemd.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21-09 21:47

Creepy

Tactical Espionage Splatterer

Je moet je srand maar 1 keer aanroepen in je programma en daarna nooit meer. Dat is de initialisatie voor de random() functie. Waarschijnlijkt levert de time(0) call dezelfde waarde op voor alle dobbelstenen.
[/spuit11, sneller posten....]

[ Voor 7% gewijzigd door Creepy op 01-04-2009 17:22 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het meervoud van dice is overigens... tatatataaaa: dice ;). In US-english is het enkelvoud overigens die, maar in de UK zeggen ze ook dan dice.

Overigens zou ik je de tip willen geven om een taal te kiezen en daar ook bij te blijven. En dus niet NUMBER_ON_DICE (Engels) en gooiDobbelsteen() (Nederlands) ;)

[ Voor 37% gewijzigd door .oisyn op 01-04-2009 17:44 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • JordyOnrust
  • Registratie: November 2007
  • Laatst online: 10-07 13:02

JordyOnrust

Leef om te leven.

Topicstarter
Eey,

Super bedankt.
Ik heb nu srand uit de loop gehaald en nu werkt het prima.

Over de spel / taalfouten, jullie hebben gelijk, zal er wat aan doen.

Super bedankt.

Als je sterft voordat je sterft, sterf je niet wanneer je sterft. Rom 6:5


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 15-07 15:35

leuk_he

1. Controleer de kabel!

nog meer offtopic
Afbeeldingslocatie: http://imgs.xkcd.com/comics/random_number.png

(moet kunnen terwijl vandaag de dag m'n pagina door lemmings wordt opgegeten. )

[ Voor 26% gewijzigd door leuk_he op 01-04-2009 18:31 ]

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23:05
Zal ik de (betere, imo) Dilbert cartoon ook nog even posten of zullen we weer on-topic gaan? :)

Acties:
  • 0 Henk 'm!

  • writser
  • Registratie: Mei 2000
  • Laatst online: 22-09 12:08
Damn, ik wou hem net posten. "Keep it random, but the same every time!" :D

Onvoorstelbaar!


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

writser schreef op woensdag 01 april 2009 @ 18:41:
Damn, ik wou hem net posten. "Keep it random, but the same every time!" :D
Wel grappig uitgedrukt, maar op zich niet zo'n vreemd verzoek... repeatable randomness is best een bekend iets.

Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Zoijar schreef op woensdag 01 april 2009 @ 19:27:
Wel grappig uitgedrukt, maar op zich niet zo'n vreemd verzoek... repeatable randomness is best een bekend iets.
Sterker nog, ik vind het uberhaupt geen WTF. Het is volledig logisch dat je een scenario opnieuw af kunt draaien zodat je bijvoorbeeld mensen kunt tonen wat ze verkeerd gedaan hebben.

https://niels.nu


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dan neem je dat op. Kun je nog vooruit- en terugspoelen ook, en bovendien de acties van de leerling erin mee kunnen nemen. Jouw argument voor niet-random data vind ik een stuk minder zinnig dan die van die admiraals, namelijk dat ze elke leerling aan dezelfde test willen onderwerpen.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
.oisyn schreef op donderdag 02 april 2009 @ 10:40:
Dan neem je dat op. Kun je nog vooruit- en terugspoelen ook, en bovendien de acties van de leerling erin mee kunnen nemen. Jouw argument voor niet-random data vind ik een stuk minder zinnig dan die van die admiraals, namelijk dat ze elke leerling aan dezelfde test willen onderwerpen.
Ik bedoel dat ze dus hetzelfde scenario nog een keer aan kunnen bieden, dus nog steeds interactief, in plaats van als een 'film'.

https://niels.nu

Pagina: 1