【问题标题】:Setting seed boost::random设置种子提升::随机
【发布时间】:2011-06-14 07:24:33
【问题描述】:

我想通过使用不同的种子数来重置随机序列。运行此测试代码时:

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

显然我做错了什么。我该如何克服这个问题?

【问题讨论】:

    标签: c++ boost random seed


    【解决方案1】:

    根据 Jim、Alan 和 Igor 的建议,对代码进行了一些更改:rng.engine().seed() 而不是 gener.seed(),并在调用 rng.engine().seed() 之后调用了 rng.distribution().reset(),它就像一个魅力。

    非常感谢!

    【讨论】:

    • 很高兴它成功了!顺便说一句,您被允许(并鼓励)接受自己的答案,尤其是当它需要结合几个人的想法来解决您的问题时。
    【解决方案2】:

    您应该在调用gener.seed() 之后调用normal.reset()。这是为了确保 normal 的输出不依赖于任何以前的来自gener的输出。

    (分布可能正在缓存一些您需要清除的状态。)

    【讨论】:

    【解决方案3】:

    我相信boost::variate_generator&lt;&gt; 会复制您的boost::mt19937 gener 对象。 因此,当您重新设定 gener 的副本时,它对已经存在的 rng 对象没有影响 被建造。每次重新播种时构造一个新的 rng 对象应该会给你想要的行为(免责声明:未经测试!)

    【讨论】:

    • 我相信重新播种对 rng 有一些影响,因为我得到重复值 -0.5887503675 ​​和 0.2504171986。但不幸的是,这根本不是我所期望的。
    • 很高兴看到问题得到解决,但我想问一下为什么boost::variate_generator&lt;&gt; 在这种情况下会复制gener?我认为 OP 在写boost::variate_generator&lt;boost::mt19937&amp;,boost::normal_distribution&lt;&gt; &gt; 时通过了引用,我错过了什么吗?...
    【解决方案4】:

    很高兴看到问题得到解决!但我想我只是想通了为什么艾伦的方法行不通……

    在编写boost::variate_generator&lt;boost::mt19937&amp;,boost::normal_distribution&lt;&gt; &gt; rng(gener, normal) 时,您并没有创建gener 的另一个副本,因为它是一个引用调用,但是您确实创建了normal 的另一个副本以及variate_generate

    因此,您应该使用rng.distribution().reset(),而不是仅重置原始normalnormal.reset。但是你可以保留gener.seed(),我怀疑它和rng.engine().seed() 的效果是一样的。

    我在我的代码中对其进行了测试,它按预期工作。

    好吧,以防万一有人关心:)

    【讨论】:

      猜你喜欢
      • 2014-11-21
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 2020-03-18
      • 2014-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多