我尝试编写一段代码,在类A中创建一个对象mt19937,它可以在类内部函数中使用,用于生成随机数,我还想将对同一对象的引用传递给类A中声明的类B的各个示例。通过引用传递的那些对象也应该能够生成随机数,供类B内部使用。
问题是:在A类中,它产生随机数,但在B类中,它产生相同的序列。
我有一个代码分隔在三个文件中,如示例所示:
A类
答:
#include <random>
#include <vector>
#include "B.h"
using namespace std;
class A
{
public:
A();
private:
mt19937 mt;
};
A.cpp:
#include "A.h"
A::A() : mt((random_device())())
{
vector<B> Bs;
for(int i = 0; i < 10; i++)
{
Bs.emplace_back(i, mt);
}
}
B类
B. h:
#include <random>
#include <iostream>
using namespace std;
class B
{
public:
B(int id, mt19937& mt);
private:
int id;
mt19937 mt;
};
B.cpp:
#include "B.h"
B::B(int id, mt19937& mt)
{
this->id = id;
this->mt = mt;
bernoulli_distribution dist(0.5);
cout << "Testing random..." << endl;
for(int i = 0; i < 10; i++)
{
cout << dist(this->mt) << " ";
}
cout << endl;
}
主电源
main.cpp:
#include "A.h"
int main()
{
A a;
return 0;
}
我不知道这是否有用,但我是这样编译的:
g++-12 B.cpp A.cpp main.cpp -o main -std=c++17
我的电脑是Macbook Pro M1,运行的是Mac操作系统Monterey 12.2.1
我试着为B的每个示例生成一个随机的数字序列,但是每个示例都得到了相同的序列。
1条答案
按热度按时间mv1qrgav1#
您传递了一个引用,但将其存储为一个对象,因此您构造了一个新的“mt”来解决这个问题(使用引用),您需要在
B.h
中进行以下更改:现在在
B.cpp
中,你需要用一个成员初始化器列表初始化引用:希望能有所帮助!