generator liczb pseudolosowych - dublowanie wartości

dział ogólny

generator liczb pseudolosowych - dublowanie wartości

Nowy postprzez Android » piątek, 25 marca 2011, 16:08

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
Avatar użytkownika
Android
Bladawiec
Bladawiec
 
Posty: 46
Dołączył(a): poniedziałek, 5 kwietnia 2010, 16:51
Podziękował : 16
Otrzymał podziękowań: 2
System operacyjny: Windows 7 Pro x64
Kompilator: C++ Builder XE2
Gadu Gadu: 0
    Windows 7Firefox

Re: generator liczb pseudolosowych - dublowanie wartości

Nowy postprzez polymorphism » piątek, 25 marca 2011, 18:57

Wywal srand poza pętlę.

Swego czasu był podobny temat. Poszukaj, jeśli chcesz wiedzieć, dlaczego tak się dzieje.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: generator liczb pseudolosowych - dublowanie wartości

Nowy postprzez Cyfrowy Baron » piątek, 25 marca 2011, 19:02

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;
}
//---------------------------------------------------------------------------

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Android
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: generator liczb pseudolosowych - dublowanie wartości

Nowy postprzez Android » niedziela, 27 marca 2011, 11:37

Wszystko działa.
Dziękuję bardzo za pomoc :)
Avatar użytkownika
Android
Bladawiec
Bladawiec
 
Posty: 46
Dołączył(a): poniedziałek, 5 kwietnia 2010, 16:51
Podziękował : 16
Otrzymał podziękowań: 2
System operacyjny: Windows 7 Pro x64
Kompilator: C++ Builder XE2
Gadu Gadu: 0
    Windows 7Firefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 29 gości

cron