我的目标是制作一个简单的程序,该程序具有不同数量的面,每个面都有自己的随机引擎和分布。我的代码生成随机数,但它们都是巨大的,并且对于不同面的骰子生成相同的数字。我的构造函数包含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 1118072656 740173846 588830575 1204807261 300732443 1167922011 1120805453 1840559451 1073257265 900590269 1598330246 535084483
您的Die
构造函数声明了两个local变量randomEngine
和dieDist
,这些变量将覆盖(或隐藏)具有相同名称的类成员-从而将它们统一化。
相反,要设置类成员,请使用如下代码:
Die::Die(int numSides) : numSides(numSides)
{
seed = static_cast<long int>(std::time(nullptr));
randomEngine = std::mt19937_64(seed);
dieDist = std::uniform_int_distribution<int>(1, numSides);
}
随时要求进一步的澄清和/或解释。