- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
除了是个垃圾程序员外,我的行话也不达标。我会尽力解释我自己。我已经使用 randomlib 实现了 Merssene twister 随机数生成器.诚然,我不太熟悉 Visual 8 C++ 的随机数生成器的工作原理,但我发现我可以在 main()
中为它播种一次 srand(time(NULL))
和我可以在其他类(class)中安全地使用 rand()
。我拥有的 Merssene twister 需要创建一个对象,然后为该对象播种。
#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
如果我想在类中生成一个随机数,我该怎么做,而不必每次都定义一个对象。我只是担心,如果我使用计算机时钟,每次运行都会使用相同的种子(每秒仅更改一次)。
我的解释对吗?
提前致谢
最佳答案
Random 对象本质上是您需要保留的状态信息。您可以使用所有常规技术:可以将其作为全局变量或将其作为参数传递。如果一个特定的类需要随机数,你可以保留一个 Random
对象作为类成员为该类提供随机性。
C++ <random>
库的相似之处在于它需要构建一个对象作为随机性/RNG 状态的来源。这是一个很好的设计,因为它允许程序控制对状态的访问,例如,保证多线程的良好行为。 C++ <random>
库甚至包括梅森扭曲算法。
这是一个示例,显示将 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
}
关于c++ - 正确播种随机数生成器(Mersenne twister)c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13166058/
Boost 提供 mt19937 和 mt19937_64 http://www.boost.org/doc/libs/1_55_0/doc/html/boost_random/reference.h
我有一小段代码可以运行 Mersenne Twister PRNG,效果很好: std::random_device randDev; std::mt19937 twister(randDev());
所以我有一个使用 Mersenne Twister 的自定义随机发生器类(我使用的代码改编自 this site)。一切似乎都运行良好,直到我开始测试不同的种子(我通常使用 42 作为种子,以确保每次
我正在将一个大型科学模拟软件迁移到 C++。在 Java 中我使用了 Cern Colt library它包括一个完整的随机分布列表。 当需要不同的发行版(例如提供的链接中列出的发行版)时,通常使用什
我读到“梅森扭曲器的计算复杂度为 O(p2),其中 p 是多项式的次数”。 这是什么意思? 这是指哪个多项式? 此外,计算复杂度是时间复杂度的另一种表述方式,还是与算法运行所需的空间量有关? 最佳答案
我有点不确定这个问题的正确论坛。它介于理论比较之间。科学/数学和编程。 我使用 Mersenne-Twister 生成伪随机数。现在,从给定的种子开始,我想跳到序列中的第 n 个数字。 我看过这个:h
这个问题在这里已经有了答案: stl random distributions and portability (1 个回答) 关闭 8 年前。 我正在使用 std::mt19937_64 生成随机
我的构造函数有什么问题?每次我调用一个应该生成随机数的函数(大约每五秒一次)时,它都会生成相同的数字。每个调用实例化下面这些对象之一。我以为我是用 m_rd 的 operator() 调用的输出随机播
我想知道如何将梅森随机数生成器保留为成员变量并在同一个类中使用它。 我编写了如下类,它运行良好,但我不喜欢 std::mt19937 被初始化。我想知道有没有办法在Test的构造函数中初始化它? #i
我有一个很简单的问题:当我们使用 Mersenne Twister -19937 生成器并修复种子时,每次调用生成器时,它都会生成具有某些特征(独立性、均匀分布)的数字序列。这里重要的是独立性(或 2
众所周知,可以反转 MT 回火功能。可在线获取源代码来执行此操作 here .我试图弄清楚这是如何工作的,以及我将如何以编程方式解决这个问题和类似的问题。 我正在努力解决的是,对有限大小的变量进行移位
我读到 Mersenne Twister 生成器的周期为 2¹⁹⁹³⁷ - 1,但我很困惑为什么会这样。我看到 this implementation Mersenne Twister 算法,在第一条
我尝试使用 32 位种子实现跨平台一致的随机数生成。大多数帖子都指向我Mersenne Twister或者编写我自己的实现。 在 source code有一个名为 void init_by_array
我想生成 1000 个不同的 k 值并计算 k 的均值和方差,但是当我使用 MT 时,它在电子表格中始终是相同的数字。以下是我的代码,希望有人能帮助我。非常感谢! int main(int argc,
我最近在使用 Mersenne-Twister 算法在 C++ 中生成随机数时遇到了一个问题。当遍历for循环并使用cout输出生成的数字时,它会重复输出相同的数字。例如,它输出类似 11 11 11
我想找出我可以用 C++ 为随机数生成器播种的最大值。我的代码如下: mt19937 myRandomGenerator(seed); 变量 seed 可以有多大?我注意到,如果该值变得太大,随机数生
我正在使用 Mersenne Twister 生成具有 1D 柏林噪声的 2D 地形以获取随机数。我的第一个想法是使用 Mersenne Twister 在任何给定的硬件上使用相同的种子总是给我相同的
我编写了一个包含不同算法的 RNG 类,但它没有按预期工作。除了我想使用正常(而不是均匀)分布这一事实之外,我的代码总是返回相同的数字(最大值)或仅返回区间 [min,max] 中的 2 个数字: s
我想使用 mt19937 遍历一个数组并从中获取每个值一次,但顺序是随机的。本质上,有没有一种方法可以使用 mt19937 仅生成一次特定范围内的所有数字(不只是忽略重复项,而是确保它不会完全产生重复
我正在我的应用程序中调整 Mersenne Twister,特别是来自 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937a
我是一名优秀的程序员,十分优秀!