gpt4 book ai didi

c++ - 如何在类构造函数中使用 C++11 随机引擎和均匀分布?

转载 作者:行者123 更新时间:2023-12-01 14:48:07 24 4
gpt4 key购买 nike

我的目标是有一个简单的程序,其中包含不同面数的骰子,每个面都有自己的随机引擎和分布。我的代码生成随机数,但它们都很大,并且为不同面的骰子生成了相同的数字。我的构造函数包含 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构造函数声明两个 本地 变量,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给出了其中的几个:

warning : declaration shadows a field of 'Die' [-Wshadow]

关于c++ - 如何在类构造函数中使用 C++11 随机引擎和均匀分布?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61348210/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com