Impostazione di semi di boost::casuale

Vorrei reset sequenze casuali utilizzando diversi numeri di semi. Quando si esegue questo codice di prova:

boost::mt19937 gener(1);
boost::normal_distribution<> normal(0,1);
boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > rng(gener, normal);
cout << rng() << endl;
cout << rng() << endl;
cout << rng() << endl;
gener.seed(2);
cout << rng() << endl;
cout << rng() << endl;
gener.seed(1);
cout << rng() << endl;
gener.seed(2);
cout << rng() << endl;
gener.seed(3);
cout << rng() << endl;

Ottengo il seguente output:

# seed(1) via constructor
-2.971829031
1.706951063
-0.430498971
# seed(2)
-2.282022417
-0.5887503675
# seed(1)
0.2504171986
# seed(2)
-0.5887503675
# seed(3)
0.2504171986

Ovviamente sto facendo qualcosa di sbagliato. Come posso ovviare a questo problema?

 

4 Replies
  1. 14

    Seguenti Jim, Alan e Igor suggerimenti apportate alcune modifiche al codice: rng.engine().seed() invece di gener.seed(), e chiamato rng.distribution().reset() dopo la chiamata a rng.engine().seed() e ha lavorato come un fascino.

    Molte grazie!

    • Contento che ha funzionato! A proposito, hai il permesso (e consigliato) di accettare la tua risposta, soprattutto se ci sono voluti una combinazione di diverse idee per risolvere il tuo problema.
  2. 5

    Si dovrebbe chiamare normale.reset() dopo la chiamata al gener.seme(). Che è specifica per assicurare che l’uscita del normale, non dipende da alcun precedente uscita dal gener.

    (La distribuzione è probabilmente la cache di qualche stato che è necessario cancellare.)

    • Sì sembra un problema di memorizzazione nella cache. Ho fatto come mi hai suggerito ma sono ancora ottenere gli stessi risultati…
    • Normalmente distribuiti Rng utilizzare il Box-Muller trasformare che genera numeri casuali in coppia (vedi: Numerico Ricette esempi)
  3. 1

    Credo boost::variate_generator<> fa una copia del tuo boost::mt19937 gener oggetto.
    Così, quando si reseed la vostra copia di gener, non ha alcun effetto sul rng oggetto che è già
    stato costruito. La costruzione di un nuovo rng oggetto ogni volta che si reseed dovrebbe dare il comportamento desiderato (disclaimer: non testato!)

    • Credo che il reseeding sta avendo effetto su di rng, perché mi sto valori ripetuti -0.5887503675 e 0.2504171986. Ma poi, purtroppo, non è affatto quello che mi sarei aspettato.
    • Bello vedere il problema risolto, ma posso chiedere perché boost::variate_generator<> fa una copia di gener in questo caso? Penso che l’OP passata di riferimento durante la scrittura di boost::variate_generator<boost::mt19937&,boost::normal_distribution<> >, mi manca qualcosa?…
  4. 1

    Bello vedere il problema risolto! Ma credo che ho solo capito perché Alan metodo non funziona…

    Durante la scrittura di boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > rng(gener, normal), non creare un’altra copia del gener perché è una chiamata per riferimento, ma si fatto creare un’altra copia del normal con il variate_generate.

    Così, invece di normal.reset, che solo ripristina l’originale normal, si dovrebbe utilizzare rng.distribution().reset(). Ma si può solo tenere gener.seed(), e che credo avrà lo stesso effetto rng.engine().seed().

    L’ho testato nel mio codice, e ha funzionato come previsto.

    Bene, solo nel caso in cui nessuno si cura 🙂

Lascia un commento