ulmus102 Temat założony przez niniejszego użytkownika |
problem z generowaniem losowych liczb rzeczywistych » 2013-04-06 23:43:57 Witam napisałem taki programik #include<iostream> #include<cstdlib> #include<ctime> using namespace std; int main() { double liczba, a = 1.25, b = 3.5; srand( time( NULL ) ); liczba = a +( double ) rand() / RAND_MAX *( b - a ); cout << liczba << endl; system( "pause" ); return 0; }
problem polega na tym, że każdorazowe uruchomienie programu generuje mi liczbę o włos różną od liczby wygenerowanej przy poprzednim uruchomieniu. Jest to liczba z tego zakresu, no ale to idiotyczne, że praktycznie za każdym razem ta sama.... Czy może ktoś wytłumaczyć, dlaczego tak się dzieje i jak uzyskać całkowitą losowość tej liczby? |
|
SeaMonster131 |
» 2013-04-06 23:49:40 Nie jestem pewien, ale rand() działa chyba tylko dla liczb całkowitych? Możesz losować od 125 do 350, a wynik dzielić przez 100. |
|
Monika90 |
» 2013-04-07 00:07:03 Problem polega na tym, że funkcja time(), której używasz do inicjalizacji generatora, zwraca w twoim systemie wartość, która zmienia się co sekundę. Więc jak uruchamiasz program w krótkich odstępach czasu, to zwraca albo tę samą wartość, albo bardzo podobną. Muisz użyć zegara o większej rozdzielczości. |
|
ulmus102 Temat założony przez niniejszego użytkownika |
» 2013-04-07 07:36:38 tak, ja też wiem, że time będzie się zmieniał co sekundę, jednak nie potrafię zrozumieć dlaczego gdy generuję liczbę całkowitą, to funkcja rand() za każdym razem zwróci mi różną wartość, ale gdy użyję rzutowania (double)rand(), to za każdym razem PIERWSZY wynik wywołania funkcji będzie bardzo zbliżony.
@SeaMonster131 no to mogłoby fajnie rozwiązać problem, tylko.... Jeśli napiszę programik gdzie a i b określające zakres generowanych liczb będą wprowadzane z klawiatury, to rodzi się problem z rozpoznaniem ilości liczb po przecinku, aby zastosować odpowiedni mnożnik. Po prostu nie umiem tego. Np ktoś wprowadzi a=3.14 i b=123.64547568578.
|
|
Monika90 |
» 2013-04-07 12:09:39 Jeżeli ziarna są podobne, to pierwsze wartości zwrócone z rand() też będą podobne. Dodaj po srand(time(NULL)); taką pętlę, celem rozgrzania generatora: for( int i = 0; i < 100; ++i ) rand();
Generalnie implementacje rand() są słabej jakości, więc nie oczekuj po nich zbyt wiele. A generowanie liczb (pseudo)losowych to zadanie dla ekspertów. |
|
pekfos |
» 2013-04-07 12:17:28 Trochę lepiej niż same srand( time( NULL ) ); : srand( time( NULL ) ^ clock() );
|
|
usmiech |
» 2013-04-07 12:22:47 Pewnie to zostanie usuniete, ale jesli nie to do losowania float rand mozna tez uzyc /dla porownania/ : #include "stdafx.h" #include <iostream> #include <cstdlib> #include <ctime> double randLosuj( double niska, double wysoka ); using namespace std; int main() { double liczba; double a = 1.25; double b = 2.5; srand( time( NULL ) ); liczba = randLosuj( a, b ); cout << liczba << endl; system( "pause" ); return 0; } double randLosuj( double niska, double wysoka ) { double n; n =( rand() /( static_cast < double >( RAND_MAX ) + 1 ) ) *( wysoka - niska ) + niska; return n; }
#include "stdafx.h" #include <ctime> #include <cstdlib> #include <iostream> using namespace std; float randLosuj( float min, float max ) { float losowa = rand() /( float ) RAND_MAX *( max - min ) + min; return losowa; };
int main() { srand( time( NULL ) ); float liczba; float a = 1.25; float b = 2.5; liczba = randLosuj( a, b ); cout << liczba << endl; system( "pause" ); return 0; }
#include "stdafx.h" #include <iostream> #include <random> using namespace std; int main() { random_device rd; default_random_engine e( rd() ); uniform_real_distribution <> liczba( 1.25, 2.5 ); for( int n = 0; n < 3; ++n ) cout << liczba( e ) << ' '; cout << '\n'; system( "pause" ); }
//Pozdrawiam :) |
|
« 1 » |