gpt4 book ai didi

c++ - 将 mt19937 与 random_device 作为静态类成员一起使用时出错

转载 作者:太空狗 更新时间:2023-10-29 20:56:58 28 4
gpt4 key购买 nike

我有一个名为 RandomNumberGenerator 的类,我想使用它使用 mt19937 算法 生成一个随机数。

我正在创建一个 random_device 对象作为种子。

当我编译时,我收到一条错误消息:
“std::__1::random_device 中没有名为 generate 的成员”。
我无法理解错误。也许我在初始化 random_devicemt19937 的对象时做错了,但我无法找出问题所在。
感谢一些帮助..

RandomNumberGenerator.h

class RandomNumberGenerator
{
static std::random_device m_rd;
static std::mt19937 m_rng;
public:
static double getRandomNumber(const double& rangeStart, const double& rangeEnd);
};

RandomNumberGenerator.cpp

#include "RandomNumberGenerator.h"

std::random_device RandomNumberGenerator::m_rd;
std::mt19937 RandomNumberGenerator::m_rng(RandomNumberGenerator::m_rd);

double RandomNumberGenerator::getRandomNumber(const double& rangeStart, const double& rangeEnd)
{
std::uniform_real_distribution<> randomizer(rangeStart, rangeEnd);
return randomizer(m_rng);
}

最佳答案

啊,你只错过了一件小东西。

std::mt19937 RandomNumberGenerator::m_rng(RandomNumberGenerator::m_rd);

上面一行发送的是实例而不是种子。因此它必须有一个 generate 函数来提供种子,而它没有。只需更改该行以调用仿函数,一切都很好。

std::mt19937 RandomNumberGenerator::m_rng(RandomNumberGenerator::m_rd());

注意:

要注意的另一项是您在每次调用时分配一个新的 std::uniform_real_distribution。虽然分布对象是轻量级的,但也可以考虑将其设为静态,只要 rangeStartrangeEnd 在后续调用中保持不变即可。但是,如果您做出该决定,初始化范围值将是一个更艰难的决定。

如果您的程序在整个生命周期内都不使用此类,请考虑将其设为实例类,并在 ctor 上获取范围,以便在生成数字后进行完全清理。

希望这对您有所帮助。

编辑:

如果您确实希望它是静态的,另一种选择是分配并完全清除函数中的所有对象,该函数将填充所有需要的值,类似于以下内容:

template<typename T, typename DISTRIBUTION_T>
static void fill(T* buffer, uint32_t const count, T const min, T const max)
{
ASSERT(buffer);
ASSERT(count);
ASSERT(max > min);

std::random_device randomDevice { };
std::mt19937_64 twisterEngine { randomDevice() };
DISTRIBUTION_T distribution(min, max);
for (uint32_t i = 0u; i < count; ++i)
buffer[i] = distribution(twisterEngine);
}

然后将其用于各种类型,如下所示:

uint32_t const COUNT = 31u;
double realValues[COUNT];
uint32_t intValues[COUNT];

RandomNumberGenerator::fill<double, std::uniform_real_distribution<double>>(realValues, COUNT, 100.0, 200.0);
RandomNumberGenerator::fill<uint32_t, std::uniform_int_distribution<uint32_t>>(intValues, COUNT, 100u, 200u);

如果这看起来像一个丑陋的接口(interface),那么将 fill 设为私有(private),并提供干净的公共(public)方法来提供您希望支持的一些类型。

关于c++ - 将 mt19937 与 random_device 作为静态类成员一起使用时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32071721/

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