gpt4 book ai didi

c++ - Mersenne Twister 种子作为成员变量

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:28 28 4
gpt4 key购买 nike

我想知道如何将梅森随机数生成器保留为成员变量并在同一个类中使用它。

我编写了如下类,它运行良好,但我不喜欢 std::mt19937 被初始化。我想知道有没有办法在Test的构造函数中初始化它?

#include <iostream>
#include <cmath>
#include <random>
#include <chrono>
#include <ctime>

class Test{
public:
Test()
{

}
void foo()
{
auto randomNum = std::uniform_int_distribution<>(0, threads.size())(rnd);
}

private:
std::mt19937 rnd
{
std::chrono::high_resolution_clock::now().time_since_epoch().count()
};
}

最佳答案

我认为您对类内初始化的确切作用感到困惑。当你有

struct foo
{
foo() {}
int bar = 10;
};

类初始化只是语法糖

struct foo
{
foo() : bar(10) {}
int bar;
};

每当编译器将成员添加到成员初始值设定项列表时(这是在您忘记它或编译器提供构造函数时完成的)它会使用您在初始化中使用的内容。所以用你的代码

class Test{
public:
Test()
{

}
void foo()
{
auto randomNum = std::uniform_int_distribution<>(0, threads.size())(rnd);
}

private:
std::mt19937 rnd
{
std::chrono::high_resolution_clock::now().time_since_epoch().count()};
};
};

成为

class Test{
public:
Test() : rnd(std::chrono::high_resolution_clock::now().time_since_epoch().count())
{

}
void foo()
{
auto randomNum = std::uniform_int_distribution<>(0, threads.size())(rnd);
}

private:
std::mt19937 rnd;
};

最好不要真的那样做,而是使用你一开始的做法,这样你就不必重复

rnd(std::chrono::high_resolution_clock::now().time_since_epoch().count())

在您编写的每个构造函数中,但如果您想要特定构造函数的其他内容,您始终可以覆盖它。

关于c++ - Mersenne Twister 种子作为成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41855288/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com