2013-03-17 10 views
10

voglio essere in grado di generare valori casuali tra 0,0 e 1,0std :: default_random_engine generare valori tra 0,0 e 1,0

ho provato ad usare

std::default_random_engine generator; 
std::uniform_real_distribution<float> distribution(0.0, 1.0); 

float myrand = distribution(generator); 

Generare valore casuale in un ciclo dà sempre questi valori:

0.000022 

0.085032 

0.601353 

0.891611 

0.967956 

0.189690 

0.514976 

0.398008 

0.262906 

0.743512 

0.089548 

Cosa posso fare per ottenere valori casuali? Non sembra così casuale se ottengo sempre gli stessi.

+0

sembra piuttosto casuale per me. Dov'è il problema? – Grizzly

+0

@Grizzly: ahem: "* Non sembra casuale se ottengo sempre gli stessi. *" –

+0

@NicolBolas: vuoi che dia gli stessi valori. Perché il debug di codice non deterministico è un dolore. Ma è ancora casuale. È solo pseudo casuale e tu stai sempre iniziando nello stesso posto. Hai solo bisogno di modificare il punto di partenza. –

risposta

6

Se ci si riferisce al fatto che si ottengono gli stessi risultati per ogni esecuzione del programma, è perché è necessario fornire un seme basato su un valore naturalmente casuale (ad esempio un numero immesso dall'utente o il numero di millisecondi trascorsi dal computer è stato acceso, o dal 1 gennaio 1970, etc.):

#include <random> 

std::default_random_engine generator; 
generator.seed(/* ... */); 
//    ^^^^^^^^^  
//    Provide some naturally random value here 

std::uniform_real_distribution<float> distribution(0.0, 1.0); 

float myrand = distribution(generator); 
11
// 1-st variant: using time() function for seed random distribution 
    std::default_random_engine generator(time(0)); 
    std::uniform_real_distribution<double> distribution(first, last); 
    return distribution(generator); 
    /*disadvantages: 

se i programmi moltiplicano aperti che utilizzano lo stesso generatore di numeri casuali
saranno uscita gli stessi risultati , perché hanno lo stesso valore di seme che è il tempo.
Questo problema risolto tramite un dispositivo a caso, si veda la descrizione di là: */

// 2-nd variant: 
std::uniform_real_distribution<double> distribution(first, last); 
std::random_device rd; 
std::default_random_engine generator(rd()); 
return distribution(generator); 
+1

+1 per 'random_device' - se sai che è disponibile sui sistemi che il tuo programma dovrebbe eseguire, mi piace di più questa soluzione. – us2012

0

ho trovato un'altra buona soluzione ...

double Generate(const double from, const double to) 
{ 
    std::random_device rd; 

    return std::bind(
     std::uniform_real_distribution<>{from, to}, 
     std::default_random_engine{ rd() })(); 
} 
Problemi correlati