Установка семян boost:: random

Я хотел бы сбросить случайные последовательности, используя разные номера семян. При запуске этого тестового кода:

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;

Я получаю следующий вывод:

# 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

очевидно, я делаю что-то очень неправильно. Как мне преодолеть эту проблему?

4 ответов


следующие предложения Джима, Алана и Игоря внесли некоторые изменения в код:rng.engine().seed() вместо gener.seed() и позвонил rng.distribution().reset() после вызова rng.engine().seed() и это сработало как заклинание.

большое спасибо!


вы должны позвонить нормально.reset () после вызова generer.семя.)( Это указано, чтобы гарантировать, что выход normal не будет зависеть от любого предыдущего выхода из generer.

(дистрибутив, вероятно, кэширует некоторое состояние, которое вам нужно очистить.)


Я считаю boost::variate_generator<> делает копию


здорово видеть, что проблема решена! Но, думаю, я только что понял, почему метод Алана не сработал...

при написании boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > rng(gener, normal), вы не создали еще одну копию gener потому что это вызов по ссылке, но вы сделал создать еще одну копию normal С variate_generate.

так вместо normal.reset, который сбрасывает только оригинал normal, вы должны использовать rng.distribution().reset(). Но вы можете просто сохранить gener.seed(), который я подозреваю, будет иметь тот же эффект, что rng.engine().seed().

я протестировал его в своем коде, и он работал, как ожидалось.

ну, на всякий случай, если кто-то будет заботиться:)