簡體   English   中英

如何在 class 構造函數中使用 C++11 隨機引擎和均勻分布?

[英]How do I use C++11 random engine and uniform distribution in class constructor?

我的目標是有一個簡單的程序,其中包含不同數量的骰子,每個骰子都有自己的隨機引擎和分布。 我的代碼生成隨機數,但它們都很大,並且為不同的骰子生成相同的數字。 我的構造函數包含 std::mt19937、std::uniform_int_distribution、一個種子和許多傳入的邊。構造函數中的所有內容都不起作用,但如果我將種子、隨機引擎和分布作為static 成員 我可以讓它工作,但是我的所有骰子只有一個分布。

// 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";
}

我期望看到的是 output 的 20 個數字 1 到 4、20 個數字 1 到 6,然后是 20 個數字 1 到 8。有人可以解釋如何在 header 文件中聲明隨機生成器和均勻分布,然后如何定義它們執行文件? 我得到的 output 是三行

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

您的Die構造函數聲明了兩個局部變量randomEnginedieDist ,它們會覆蓋(或隱藏)具有相同名稱的 class 成員 - 因此這些成員都未初始化。

相反,要設置 class 成員,請使用如下代碼:

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] 的字段

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM