【问题标题】:How do I use C++11 random engine and uniform distribution in class constructor?如何在类构造函数中使用 C++11 随机引擎和均匀分布?
【发布时间】:2020-08-04 11:24:39
【问题描述】:

我的目标是创建一个简单的程序,其中包含不同数量的骰子,每个骰子都有自己的随机引擎和分布。我的代码生成随机数,但它们都很大,并且为不同的骰子生成相同的数字。我的构造函数包含 std::mt19937、std::uniform_int_distribution、种子和传入的多个边。构造函数中的所有内容都不起作用,但是如果我将种子、随机引擎和分发作为静态成员我可以让它工作,但是我的所有骰子只有一个分布。

// Die.h
#pragma once

#include <random>

class Die {
   private:
      int numSides;
      long int seed;
      std::mt19937_64 randomEngine;
      std::uniform_int_distribution<int> dieDist;
   public:
      explicit Die(int numSides);
      int roll();
};

// Die.cpp
#include "Die.h"
#include <ctime>
#include <iostream>

Die::Die(int numSides) : numSides(numSides) {
   seed = static_cast<long int>(std::time(nullptr));
   std::mt19937_64 randomEngine(seed);
   std::uniform_int_distribution<int> dieDist(1,numSides);
}

int Die::roll() {
   return dieDist(randomEngine);
}

// Die.h testing
#include <iostream>
#include "Die.h"

int main() {
   Die side4Die(4);
   Die side6Die(6);
   Die side8Die(8);
   Die side10Die(10);
   Die side12Die(12);
   Die side20Die(20);

   for (int i = 0; i < 20; i++) {
      std::cout << side4Die.roll() << "  ";
   }
   std::cout << "\n\n";

   for (int i = 0; i < 20; i++) {
      std::cout << side6Die.roll() << "  ";
   }
   std::cout << "\n\n";

   for (int i = 0; i < 20; i++) {
      std::cout << side8Die.roll() << "  ";
   }
   std::cout << "\n\n";
}

我希望看到的是输出 20 个数字 1 到 4、20 个数字 1 到 6,然后是 20 个数字 1 到 8。有人可以解释如何在头文件中声明随机生成器和均匀分布,然后如何在实现文件中定义它们?我得到的输出是三行

1689685134 537902435 1526154843 2032953622 41384282 869520735 539700904 48774590 740173846 1118072656 588830575 1204807261 300732443 1167922011 1120805453 1840559451 1073257265 900590269 1598330246 535084483 P>

【问题讨论】:

    标签: c++ random constructor distribution


    【解决方案1】:

    您的 Die 构造函数声明了两个 local 变量,randomEnginedieDist,它们会覆盖(或隐藏)具有相同名称的类成员 - 因此它们会保持单化.

    相反,要设置类成员,请使用如下代码:

    Die::Die(int nSides) : numSides(nSides) // Best not to use the same name twice!
    {
        seed = static_cast<long int>(std::time(nullptr));
        randomEngine = std::mt19937_64(size_t(seed)); // Argument really should be a size type.
        dieDist = std::uniform_int_distribution<int>(1, numSides);
    }
    

    请随时要求进一步澄清和/或解释。

    注意:打开编译器警告有助于发现此类问题!对于您的原始代码,clang-cl 给出了其中的几个:

    警告:声明遮蔽了 'Die' [-Wshadow] 的字段

    【讨论】:

      猜你喜欢
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 2015-08-14
      • 2015-12-30
      • 1970-01-01
      相关资源
      最近更新 更多