random-getal generator in c++

Pagina: 1
Acties:
  • 693 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • TumbleCow
  • Registratie: Januari 2000
  • Laatst online: 07-01 11:08

TumbleCow

Waarschijnlijkheids elastiekje

Topicstarter
Hallo iedereen..

de vraag is een beetje hoe ik een beetje een fatsoenelijke random-getal generator maak in c++, want wat ik ook probeer:
- OF ik krijg telkens dezelfde random getallen,
- OF hij gebruikt een langszame timer, met als gevolg dat alle getallen hetzelfde zijn zoals in dit proggie..
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdlib.h>
#include <time.h>
#include <iostream.h>

int random_numb(); // returns a random number between 0 and 100


void main()
{
int random,i;

    for (i=0; i < 10; i++)
    {
        random = random_numb();
        cout << random <<endl;

    }
    cin.get();
}


int random_numb() // returns a random number between 0 and 100
{
   int i;
   time_t t;

   srand((unsigned) time(&t));
   return rand() % 101;
}

Acties:
  • 0 Henk 'm!

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Je hoeft srand() maar 1 keer aan te roepen, aan het begin van je programma, dus vlak achter main().

Acties:
  • 0 Henk 'm!

Anoniem: 19476

Van te voren ook eerst 'randomize()' aanroepen dacht ik...

Acties:
  • 0 Henk 'm!

Anoniem: 13380

Wat ik altijd doe is rand aanroepen met als argument de huidige tijd. Is een hele goede methode om 'echt' random getallen te krijgen.

Acties:
  • 0 Henk 'm!

  • looskuh
  • Registratie: Februari 2000
  • Laatst online: 07-12-2024

looskuh

Dawwgg

hmmm, waarom heb je en aparte functie daarvoor?
Je moet sowieso eerst randomize() aanroepen, en dan gewoon random() aanroepen. Bijvoorbeeld:

random_getal = random(200) + 150
geeft een random getal tussen 150 en 350.

Acties:
  • 0 Henk 'm!

  • Orphix
  • Registratie: Februari 2000
  • Niet online
nee, srand(time(NULL)); aanroepen is voldoende
randomize() is voor zover ik weet iets van borland only en niet echt portable. van random() weet ik het zo niet.

Acties:
  • 0 Henk 'm!

  • Bergie
  • Registratie: Augustus 2000
  • Laatst online: 31-05 17:39

Bergie

Lekker belangrijk...

srand is voor het 'seeden' van de randomizer. Dit hoeft maar een keer uitgevoerd te worden en dit kan inderdaad het beste met de tijd gebeuren omdat je met een vaste waarde iedere keer dezelfde 'random' getallen krijg.

Yamaha MT-09


Acties:
  • 0 Henk 'm!

Anoniem: 13700

looskuh: Je moet sowieso eerst randomize() aanroepen, en dan gewoon random() aanroepen.

Onder *nix wel ja ;)

rand() en srand() zijn ISO 9899 functies; random(), srandom(), initstate() en setstate() is BSD 4.3; randomize() ken ik niet.

Acties:
  • 0 Henk 'm!

  • WarMaster
  • Registratie: Juni 1999
  • Niet online

WarMaster

Nosce te ipsum

Er is ook een functie int random (int num)

Waarbij hij een int terug poept tussen de waarde van 0 en num-1.

Alleen deze werkt niet sterk. Elke keer dezelfde random nummers :( :( :(

Alle dingen hier boven zijn leuk als je totaal random nummers wil hebben, maar als je iets randoms in een domein of bereik wil hebben zit je vast...

Of niet?

We live in a primitive time don't we, neither savage nor wise. Half measures are the curse of it; any rational society would either kill me or put me to some use.


Acties:
  • 0 Henk 'm!

Anoniem: 13700

Op dinsdag 06 maart 2001 00:01 schreef WarMaster het volgende:
Er is ook een functie int random (int num)

Waarbij hij een int terug poept tussen de waarde van 0 en num-1.
Zoals ik al opmerkte is deze functie geen iso of posix standaard; en komt dus niet op elk systeem voor.
Alleen deze werkt niet sterk. Elke keer dezelfde random nummers :( :( :(
Mja, dat krijg je als je de generator niet seeded met srandom()...
Alle dingen hier boven zijn leuk als je totaal random nummers wil hebben, maar als je iets randoms in een domein of bereik wil hebben zit je vast...

Of niet?
Ehh, die int parameter van random() bepaalt toch het bereik, je kunt evt. nog een waarde optellen bij de geretourneerde waarde.

<edit>typo</edit>

Acties:
  • 0 Henk 'm!

  • WarMaster
  • Registratie: Juni 1999
  • Niet online

WarMaster

Nosce te ipsum

Ben er al uit...

Moet eerst randomize(); ergens tussen proppen, pas daarna krijg je goede resultaten bij random(num);.

Waarom is mij ook een raadsel.

Ik vat alleen dat seeden nog niet helemaal.

We live in a primitive time don't we, neither savage nor wise. Half measures are the curse of it; any rational society would either kill me or put me to some use.


Acties:
  • 0 Henk 'm!

Anoniem: 13700

Even heel eenvoudig gesteld. Een (pseudo)random nummer generator werkt met een mathematische functie waarbij de uitkomst van de vorige aanroep gebruikt wordt als invoer voor de volgende aanroep, dus:
x1 = f(x0)
x2 = f(x1)
x3 = f(x2) enz.
Hierbij zijn de x-waardes dus de opeenvolgende pseudo-random getallen die de generator produceert. Wat is nu het seeden van de generator? Simpelweg het zetten van de x0 waarde.

<edit>
Die x0 waarde wordt dus de seed (zaad) genoemd. De getallen zijn maar pseudo-random, omdat een seed telkens de zelfde getallen in de zelfde volgorde produceert. Dat seeden is precies wat de randomize() functie doet, hij propt datum/tijd informatie in de seed, zodat de kans dat je twee maal vlak achter elkaar de zelfde getallenreeks krijgt klein wordt.

Je hoeft dus maar een maal randomize() aan te roepen in je programma, en wel voor je de eerste keer random() aanroept.
</edit>

Acties:
  • 0 Henk 'm!

  • WarMaster
  • Registratie: Juni 1999
  • Niet online

WarMaster

Nosce te ipsum

Ik dank u, mietje... :)

Klinkt niet echt, maar de bedoeling is goed :)

We live in a primitive time don't we, neither savage nor wise. Half measures are the curse of it; any rational society would either kill me or put me to some use.

Pagina: 1