Настройка увеличения семян :: случайный - PullRequest
9 голосов
/ 24 января 2011

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

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 ]

14 голосов
/ 25 января 2011

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

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

5 голосов
/ 24 января 2011

Вы должны вызывать normal.reset () после вызова gener.seed (). Это указывается, чтобы гарантировать, что вывод normal не будет зависеть от какого-либо предыдущего вывода gener.

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

1 голос
/ 17 августа 2012

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

При написании 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().

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

Ну, простона случай, если кому-то все равно :) 1020 *

1 голос
/ 24 января 2011

Я полагаю, boost::variate_generator<> делает копию вашего boost::mt19937 gener объекта. Поэтому, когда вы повторно скопируете свою копию gener, это не повлияет на объект rng, который уже был построен. Построение нового объекта rng каждый раз при повторном посеве должно дать вам желаемое поведение (отказ от ответственности: не проверено!)

...