mt19997通过引用传递的C++对象总是生成相同的值

c2e8gylq  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(135)

我尝试编写一段代码,在类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的每个示例生成一个随机的数字序列,但是每个示例都得到了相同的序列。

mv1qrgav

mv1qrgav1#

您传递了一个引用,但将其存储为一个对象,因此您构造了一个新的“mt”来解决这个问题(使用引用),您需要在B.h中进行以下更改:

#include <random>
#include <iostream>

using namespace std;

class B
{
    public:
        B(int id, mt19937& mt);
    private:
        int id;
        mt19937 &mt; //<--- we need a reference
};

现在在B.cpp中,你需要用一个成员初始化器列表初始化引用:

#include "B.h"

B::B(int id, mt19937& mt) : mt(mt) // <-- initializer list
{
    this->id = id;
    // this->mt = mt; <-- we don't need this

    bernoulli_distribution dist(0.5);
    cout << "Testing random..." << endl;
    for(int i = 0; i < 10; i++)
    {
        cout << dist(this->mt) << " ";
    }
    cout << endl;
}

希望能有所帮助!

相关问题