[英]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
構造函數聲明了兩個局部變量randomEngine
和dieDist
,它們會覆蓋(或隱藏)具有相同名稱的 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.