Strona 1 z 1

generator liczb pseudolosowych - dublowanie wartości

Nowy postNapisane: piątek, 25 marca 2011, 16:08
przez Android
Witam,
Podobny problem był poruszany w wielu miejscach na różnych stronach ale nie znalazłem tam rozwiązania. Korzystam z kodu:
Kod: Zaznacz cały
int randint=0;
    srand(time(NULL));
    for(int i=0; i <20; i++)
    {
    randint=rand()%100;
    cout<<randint<<" ";
    }

Wszystko działa ok jeśli powyższa pętla jest w main lub bezpośrednio w funkcji. Niestety jeśli utworze funkcję:
Kod: Zaznacz cały
int GenJednaWartosc(int granica_przedzialu)
{
         int randint=0;
    srand(time(NULL));
        randint=rand()%granica_przedzialu;
        return randint;
}

i wywołam ją 4 razy po sobie w main to za każdym razem wartość jest taka sama. Nie wiem dlaczego - jeżeli w tym samym miejscu umieszczę taka pętle jak na początku postu działa ok, podobnie taka sama pętla w funkcji również generuje różne wartości - problem powstaje tylko w przypadku wywołania funkcji. Sprawdzałem również przeniesienie srand przed wywołanie funkcji - nie pomogło.
Z góry dziękuję za pomoc.
Pozdrawiam,
Android

Re: generator liczb pseudolosowych - dublowanie wartości

Nowy postNapisane: piątek, 25 marca 2011, 18:57
przez polymorphism
Wywal srand poza pętlę.

Swego czasu był podobny temat. Poszukaj, jeśli chcesz wiedzieć, dlaczego tak się dzieje.

Re: generator liczb pseudolosowych - dublowanie wartości

Nowy postNapisane: piątek, 25 marca 2011, 19:02
przez Cyfrowy Baron
Android napisał(a):i wywołam ją 4 razy po sobie w main to za każdym razem wartość jest taka sama


Dlatego jest taka sama, gdyż uruchamiając wielokrotnie generator liczb losowych srand zerujesz go i za każdym uruchomieniem generator zaczyna liczyć od nowa.

Uruchom generator tylko raz w funkcji main. Po uruchomieniu generator działa do zakończenia programu. Funkcja srand niczego nie losuje, lecz uruchamia losowanie, za samo losowanie odpowiedzialna jest funkcja rand.

Android napisał(a):Wszystko działa ok jeśli powyższa pętla jest w main lub bezpośrednio w funkcji. Niestety jeśli utworze funkcję:


Działa dobrze gdyż w funkcji main generator zostaje uruchomiony tylko raz, ponowne uruchamianie generatora w funkcji jest błędem.

Tak powinno to wyglądać:

KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <tchar.h>
#include <iostream.h>
#include <fstream.h>
#include <conio.h>
#include <stdlib.h>
//---------------------------------------------------------------------------

using namespace std;

#pragma argsused

int GenJednaWartosc(int granica_przedzialu);

int _tmain(int argc, _TCHAR* argv[])
{
 srand(time(NULL));

 for(int i = 0; i < 20; i++)
 {
    cout << GenJednaWartosc(100) << " ";
 }

 getch();

 return 0;
}
//---------------------------------------------------------------------------
int GenJednaWartosc(int granica_przedzialu)
{
 int randint = 0;
 randint = rand() % granica_przedzialu;
 return randint;
}
//---------------------------------------------------------------------------

Re: generator liczb pseudolosowych - dublowanie wartości

Nowy postNapisane: niedziela, 27 marca 2011, 11:37
przez Android
Wszystko działa.
Dziękuję bardzo za pomoc :)