2009-10-28 16 views
11

Sembra che si può utilizzare il seguente codice per la produzione di numeri casuali da una particolare distribuzione normale:aumentare biblioteca di numeri casuali, usare lo stesso generatore di numeri casuali per i diversi generatori variati

float mean = 0, variance = 1; 
boost::mt19937 randgen(static_cast<unsigned int>(std::time(0))); 
boost::normal_distribution<float> noise(mean, variance); 
variate_generator<mt19937, normal_distribution<float> > nD(randgen, noise); 

float random = nD(); 

Questo funziona bene, però, vorrebbe poter trarre numeri tra diverse distribuzioni, cioè si potrebbe pensare qualcosa come:

float mean1 = 0, variance1 = 1, mean2 = 10, variance2 = 0.25; 
boost::mt19937 randgen(static_cast<unsigned int>(std::time(0))); 
boost::normal_distribution<float> noise1(mean1, variance1); 
boost::normal_distribution<float> noise2(mean2, variance2); 
variate_generator<mt19937, normal_distribution<float> > nD(randgen, noise1); 
variate_generator<mt19937, normal_distribution<float> > nC(randgen, noise2); 

float random1 = nD(); 
float random2 = nC(); 

Tuttavia, il problema sembra essere che nD() e nC() generano sequenze simili di numeri. Suppongo che ciò sia dovuto al fatto che il costruttore di variate_generator sembra eseguire una copia di randgen, non usarla esplicitamente. Quindi, viene generata la stessa sequenza psuedo-random e semplicemente spinta attraverso diverse trasformazioni (a causa dei diversi parametri delle distribuzioni).

Qualcuno sa se esiste un modo, in Boost, per creare un singolo generatore di numeri casuali e utilizzarlo per più distribuzioni? In alternativa, la progettazione della libreria casuale Boost richiede agli utenti di creare un generatore di numeri casuali per distribuzione? Ovviamente, potrei scrivere codice per trasformare una sequenza di numeri casuali uniformi in una sequenza da una distribuzione arbitraria, ma sto cercando qualcosa di semplice e già integrato nella libreria.

Grazie in anticipo per il vostro aiuto.

risposta

11

L'ipotesi è corretta. Si desidera che entrambe le istanze variate_generator utilizzino la stessa istanza di generatore di numeri casuali. Quindi utilizzare un riferimento a mt19937 come parametro del modello.

variate_generator<mt19937 &, normal_distribution<float> > nD(randgen, noise1); 
variate_generator<mt19937 &, normal_distribution<float> > nC(randgen, noise2); 

Ovviamente si dovrà garantire randgen non va fuori portata prima nD e nC fare.

+0

Sembra aver funzionato perfettamente. Il fare il primo parametro template cambia semplicemente la memoria interna del generatore di numeri casuali come riferimento? Grazie. – RandomGuy

+1

Sì. La classe del generatore di variate è (relativamente) semplice. La classe istanziata originale aveva una variabile membro di tipo 'mt19937'. Quello corretto, aveva una variabile membro per digitare 'mt19937 &'. Non si verificano ulteriori cambiamenti. – AFoglia

+1

L'utilizzo di un riferimento a mt19937 rende il generatore di variabili non assegnabile; se hai bisogno di un incarico, potresti usare un tipo di puntatore. Cioè variate_generator > nD (...); –

Problemi correlati