Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

problem z generowaniem losowych liczb rzeczywistych

Ostatnio zmodyfikowano 2013-04-07 12:22
Autor Wiadomość
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

C/C++
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main()
{
    //liczba losowa z zakresu <1.25 , 2.5>
    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?
P-80117
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.
P-80118
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.
P-80121
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.
P-80125
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:
C/C++
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.
P-80141
pekfos
» 2013-04-07 12:17:28
Trochę lepiej niż same
srand( time( NULL ) );
:
C/C++
srand( time( NULL ) ^ clock() );
P-80142
usmiech
» 2013-04-07 12:22:47
Pewnie to zostanie usuniete, ale jesli nie to do losowania float rand mozna tez uzyc /dla porownania/ :

C/C++
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
double randLosuj( double niska, double wysoka );
using namespace std;
int main()
{
    //liczba losowa z zakresu <1.25 , 2.5>
    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;
}


//kolejny sposob to zamiast konwersji do cast zastosowanie float

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

// kolejny to zastosowanie boost_random

// http://www.boost.org/doc/libs/release/doc/html/boost_random.html


#include "stdafx.h"
#include <iostream>
#include <random> // biblioteka boost_random
using namespace std;
int main() {
    random_device rd;
    default_random_engine e( rd() ); // seed PRNG
    uniform_real_distribution <> liczba( 1.25, 2.5 ); // przedzial liczb
    for( int n = 0; n < 3; ++n ) // okreslasz ile losowych liczb chcesz wydrukowac, tu 3
         cout << liczba( e ) << ' ';
   
    cout << '\n';
    system( "pause" );
}

 //Pozdrawiam :)



P-80143
« 1 »
  Strona 1 z 1