gpt4 book ai didi

c++ - 如何在 C++ 中有效地构造随机骰子

转载 作者:行者123 更新时间:2023-12-02 10:20:44 27 4
gpt4 key购买 nike

我有课dieClass表示六面骰子,我使用 <random>设置号码。这是头文件die.h :

#include <random>
#include <iostream>

class dieClass
{
public:
dieClass();
int getNum() const { return num; }

private:
int num;
static std::uniform_int_distribution<int> distribution;
};

这是实现文件 die.cpp :
#include "die.h"

dieClass::dieClass()
{
static std::random_device rdevice{};
static std::default_random_engine generator{rdevice()};
num = distribution(generator);
}

std::uniform_int_distribution<int> dieClass::distribution{1, 6};


问题:如果我调用 dieClass dice[5] ,我创建了五个 default_random_engines ,或者只是一个,因为它是静态的?基本上,构建数百万个骰子的最有效方法是什么?我可以申报 generator在构造函数之外,就像我为 distribution 所做的那样?我不完全理解 private 和 static 的作用。

编辑:重新安排这样的事情似乎可以达到我想要的效果,尽管它可能不是最佳实践。我从类中提取了所有随机数生成代码并将其粘贴在实现文件中。现在我可以调用 generator来自函数 roll .
dieClass.h
#include <iostream>

class dieClass
{
public:
die();
void roll();
int getNum() const { return num; }

private:
int num;
};
dieClass.cpp
#include <random>
#include "die.hpp"

std::random_device rdevice{};
std::default_random_engine generator{rdevice()};
std::uniform_int_distribution<int> distribution{1, 6};

dieClass::dieClass()
{
num = distribution(generator);
}

void dieClass::roll()
{
num = distribution(generator);
}

最佳答案

如果您要拥有数百万个骰子,我更喜欢您的第二个示例。拥有一个随机生成器会更有效。但是,您可以将其封装在一个类中,而不是为您的骰子生成一个全局随机数生成器。

像静态变量一样,你应该 avoid尽可能使用全局变量。可以向您的dieClass 注入(inject)指向这个新生成器类的引用或指针。 .只需更改构造函数以接受它。每当您想生成新号码时,只需调用新类的方法即可。

这是一个例子:

#include <random>
#include <iostream>

class RandomNumberGenerator
{
public:
RandomNumberGenerator() : mRd(), mGen(mRd()), mDis(1, 6) {}
~RandomNumberGenerator() = default;

inline int Generate() { return mDis(mGen); }

private:
std::random_device mRd;
std::mt19937 mGen;
std::uniform_int_distribution<int> mDis;
};


class dieClass
{
public:
dieClass(RandomNumberGenerator &gen) : mGenerator(gen), num(gen.Generate()) {}
int getNum() const { return num; }
void roll() { num = mGenerator.Generate(); }

private:
RandomNumberGenerator &mGenerator; //store as reference to avoid copying
int num;
};

这种方式是 RandomNumberGenerator 的责任生成随机数的类,而不是 dieClass类(class)。

工作版 here .

关于c++ - 如何在 C++ 中有效地构造随机骰子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60336577/

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