如何使用 std::mt19937 避免相同的随机结果
How to avoid same random results using std::mt19937?
我下面的代码受到线程"std::mt19937 需要预热吗?"的影响。执行时,生成两个具有相同内容的向量,这不是我想要的。我预计两个向量中都有不同的内容。我做错了什么以及如何解决它?
输出:
0.251423
0.729274
-1.43542
0.251423
0.729274
-1.43542
法典:
#include <vector>
#include <algorithm>
#include <iostream>
#include <random>
#include <array>
#include <functional>
#include <iterator>
class functor1
{
public:
functor1()
{
std::random_device device;
std::array<int, std::mt19937::state_size> seeds;
std::generate_n(seeds.data(), seeds.size(), std::ref(device));
std::seed_seq sequence(std::begin(seeds), std::end(seeds));
engine.seed(sequence);
}
double operator()()
{
std::normal_distribution<double> distribution(0.0, 1.0);
return distribution(engine);
}
private:
std::mt19937 engine;
};
int main()
{
functor1 f1;
std::vector<double> v0;
std::vector<double> v1;
std::generate_n(std::back_inserter(v0), 3, f1);
std::generate_n(std::back_inserter(v1), 3, f1);
std::ostream_iterator<double> out(std::cout, "n");
std::copy(v0.begin(), v0.end(), out);
std::copy(v1.begin(), v1.end(), out);
}
谢谢
这是因为f1
被复制到generate_n()
函数调用中。改用std::ref(f1)
,它将为 v0
和 v1
返回不同的结果:
std::generate_n(std::back_inserter(v0), 3, std::ref(f1));
std::generate_n(std::back_inserter(v1), 3, std::ref(f1));
相关文章:
- C++剪贴板队列粘贴随机结果?
- 为什么我在这个模板上有随机结果?
- 我在运行函数 GetVolumeInformation() 时得到非常随机的结果
- 如果我在每个平台上使用相同的种子,随机结果会相同吗?
- 尝试以随机字符(长读取)打印字符串返回结果
- C 编程:在循环时运行 2 并从 loop1 获取数据的随机结果
- 随机洗牌似乎会产生相同的结果,但仅在前两个实例中产生相同的结果.我如何避免这种情况
- 我如何在 c++ 中执行随机结果,如下所示的代码
- C++时间()给我的结果几乎是随机的
- 生成随机骰子并测量结果的频率
- 生成随机QString每次都会产生相同的结果
- 简单的代码,看似随机的结果——这是由于过时的引用造成的吗
- C++随机字符串返回意外结果
- 为什么起始值会影响种子随机的结果
- 如何使用 std::mt19937 避免相同的随机结果
- 当我编译和运行C++时,随机生成器给出了相同的结果
- 使用pthread时的随机结果
- 如何创建一个不会重复结果的随机事件
- 为什么rand()/double(rand_MAX)的第一个结果不是随机的
- 为什么我得到随机结果与移位操作符(c++)