我有一个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 的作用。

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

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);
}

#1楼 票数:1 已采纳

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

像静态变量一样,您应该尽可能避免使用全局变量。 可以将这个新生成器类的引用或指针注入到dieClass 只需更改构造函数以接受它。 每当您想生成新数字时,只需调用新类的方法即可。

下面是一个例子:

#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类来生成randome数量,而不是dieClass类。

工作版本在这里

  ask by user3100212 translate from so

未解决问题?本站智能推荐:

6回复

一个类是否有用于仅包含(默认情况下)c++中的私有成员?

默认情况下,类的成员在c ++中是私有的。 因此,我想知道是否有任何可能的用法来创建一个将其所有成员(变量和函数)默认设置为private的类。 换句话说,没有任何关键字public , protected或private ,是否存在任何有意义的类定义?
1回复

c#中私有静态方法的用法是什么?

我有一个名为MyClass.cs的公共类。 它有3种方法: 我使用ReSharper作为重构工具。 它建议对MyPrivateMethod使用static 。 但是这个关键字的用法是什么? 由于该方法是私有的,因此不会在其他想要使用MyClass实例的类中使用。 我测试并发现,
1回复

如何在JavaScript的继承方法中访问私有属性

我试图调用一个继承的方法,该方法必须访问当前对象的私有属性。 但是它只能访问公共的,这是怎么回事? 我的测试代码应同时提醒两个变量: jsfiddle版本: http : //jsfiddle.net/gws5s/6/ 在此先感谢亚瑟
1回复

C++仅继承公共构造函数

我正在尝试从基类继承构造函数,但出现错误:C2876:'Poco :: ThreadPool':并非所有重载都可以访问。 Poco :: ThreadPool具有3个构造函数,2个公共构造函数(均带有默认初始化参数)和1个私有构造函数。 我如何只继承公共构造函数? 我没有使用c ++
2回复

如何生成无限随机数的骰子直到它们相等?

我正在尝试模拟一个将掷出一对骰子的程序,它将生成结果,直到变量相等,但我无法弄清楚这一点。 #include<iostream>#include<cstdlib>#include<ctime>using namespace std;int main() {
1回复

如何在C++中有效地生成多边形内部的随机X和Y值?

所以我正在创建一个虚拟地图软件,它基本上将坐标分解为区域。 区域由定义的边界坐标列表(构成区域外缘的坐标,它们相互连接)组成。 使用此软件,我需要在每个区域中随机选择位于区域边界坐标内的点。 每个区域都与另一个不同,可以有更多或更少的边,但最少有 3 个边,没有最大边。 我目前有一个解决方案,我只是
4回复

如何在C++中有效地生成排序的均匀分布的随机数?

我想在 C++ 中生成大量排序且均匀分布的随机数n (即n >= 1,000,000,000 )。 我考虑的第一个也是简单的方法是 使用std::uniform_real_distribution<double>顺序生成n均匀分布的数字, 然后使用std::sort对它们进行st
1回复

C++相同的值通过两个for循环随机生成

所以我在这里为这个循环工作: 对于上下文,整数“长度”是随机生成的字符串大小。 这是我的randGen()函数: 基本上,我的问题是,如果'num'大于1,它将为每个打印出来的相同部分打印出开始随机生成的部分,并且不会改变。 只有当'length'的大小增加时,才出现新的随机生成的字