【问题标题】:Correctly seeding random number generator (Mersenne twister) c++正确播种随机数生成器(Mersenne twister)c ++
【发布时间】:2023-03-18 09:32:01
【问题描述】:

除了是个垃圾程序员之外,我的行话还不够格。我会尽力解释我自己。 我已经使用randomlib 实现了一个 Merssene twister 随机数生成器。 诚然,我对 Visual 8 C++ 的随机数生成器的工作原理不太熟悉,但我发现我可以在 srand(time(NULL)) 中播种一次 main() 并且我可以在其他课程中安全地使用 rand()。 我拥有的 Merssene 捻线机需要创建一个对象,然后为该对象播种。

#include <RandomLib/Random.hpp>
RandomLib::Random r;        // create random number object
r.Reseed();                 // seed with a "unique" seed
float d = r.FloatN();   // a random in [0,1] rounded to the nearest double

如果我想在一个类中生成一个随机数,我该如何做到这一点,而不必每次都定义一个对象。我只是担心如果我使用计算机时钟,我每次运行都会使用相同的种子(每秒只会改变一次)。

我解释得对吗?

提前致谢

【问题讨论】:

  • 查看文档,您应该对您拥有的Reseed() 感到满意。 randomlib.sourceforge.net/html/…
  • 为什么要强调“正确”?如果您不这么说,您是否认为我们会给出不正确的答案?
  • 将对象作为静态成员存储在类中。这样,该类的所有对象都将使用相同的 RandomLib::Random 对象。
  • @GigaWatt 我在看Reseed(),但它感觉不对。您是否建议每次生成随机数时都使用上面的代码? @KerrekSB 我实际上不确定我的意思是正确的......
  • @NikosChantziaras 我之前正在玩这个。但是我仍然害怕如果使用 time(0),每个唯一的类都会被相同的数字播种(我知道还有其他播种选项)

标签: c++ random srand


【解决方案1】:

Random 对象本质上是您需要保留的状态信息。您可以使用所有常规技术:您可以将其作为全局变量或将其作为参数传递。如果某个特定的类需要随机数,您可以将 Random 对象作为类成员来为该类提供随机性。


C++ &lt;random&gt; 库的相似之处在于它需要构造一个对象作为随机性/RNG 状态的来源。这是一个很好的设计,因为它允许程序控制对状态的访问,例如,保证多线程的良好行为。 C++ &lt;random&gt; 库甚至包括梅森捻线算法。

这是一个将 RNG 状态保存为类成员的示例(使用 std::mt19937 而不是 Random

#include <random> // for mt19937
#include <algorithm> // for std::shuffle
#include <vector>

struct Deck {
    std::vector<Cards> m_cards;
    std::mt19937 eng; // save RNG state as class member so we don't have to keep creating one

    void shuffle() {
        std::shuffle(std::begin(m_cards), std::end(m_cards), eng);
    }
};

int main() {
    Deck d;
    d.shuffle();
    d.shuffle(); // this reuses the RNG state as it was at the end of the first shuffle, no reseeding
}

【讨论】:

  • 如何将其存储为全局变量(对不起,我太天真了)。 “如果一个特定的班级需要......”你是在问它是否只有一个班级?
  • 全局变量只是在全局级别定义的变量;不在函数或类或任何东西中。
  • mt19937 是视觉 08 的一部分吗?
  • 我相信它是在 2010 版本中首次添加到 Visual Studio 中的。
  • @user1002744 :它在 VC++ 2008 SP1 中,在 std::tr1 命名空间中。它不在 VC++ 2008 RTM 中,也不在 VC++ 2005 中(我不知道你所说的“visual 8”是什么意思)。
猜你喜欢
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 2010-11-13
  • 2012-09-01
  • 2010-12-19
  • 2014-05-20
相关资源
最近更新 更多