PDA

View Full Version : [C++] Problema generatore numeri random


carugo
14-04-2015, 16:27
Ciao a tutti ho un problema con il seguente codice
#include <iostream>
#include <random>
#include <iomanip>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()
{
int dado1, dado2;


default_random_engine generatore(time(0));
uniform_int_distribution<int> dado(1, 6);

dado1 = dado(generatore);
dado2 = dado(generatore);


cout <<dado1 <<" " <<dado2 <<endl;

Non riesco a capire come mai il "dado1" è sempre uguale mentre il "dado2" è random dove sbaglio?

TNX a TUTTI

Daniels118
16-04-2015, 12:54
Niente di misterioso, la funzione time restituisce il numero di secondi dal 1° gennaio 1970. Da quel giorno di secondi ne sono trascorsi un bel po', in questo momento circa 1.4 miliardi. Tra un minuto, un'ora, un giorno, un mese, sempre 1.4 miliardi rimangono, cambiano solo le cifre meno significative.
Siccome il generatore di default è un generatore lineare, seed vicini producono come primo output numeri relativamente vicini tra loro, basta analizzare la formula:
nuova_x = (a * x + c) % MAX_INT
Facciamo un esempio con a=3, c=2 e MAX_INT=100:
con x = 100 -> (3*100+2)%100 = 2
con x = 102 -> (3*102+2)%100 = 8
una differenza di n nel seme produce una differenza di 2*n nel risultato, in questo appena 6.
Questa differenza che può sembrare enorme, diventa microscopica quando applichi uniform_int_distribution.
Prova a moltiplicare time(0) per 100000 quando inizializzi il generatore e vedi che succede.

71106
16-04-2015, 13:18
Oppure usa random_device (http://en.cppreference.com/w/cpp/numeric/random/random_device):


random_device rd;
default_random_engine dre(rd());
uniform_int_distribution<unsigned int> uid(1, 6);
cout << uid(dre) << " " << uid(dre) << endl;