[英]Use <random> in a c++ class
我想在程序中使用<random>
库,并且我将拥有具有不同分布的类,并且我想在程序中的不同时间生成一个数字。 当前我的头文件中有以下内容
#include <random>
#include <time.h>
class enemy {
private:
int max_roll;
typedef std::mt19937 MyRng;
MyRng rng;
public:
enemy(int MR){
max_roll = MR;
rng.seed(time(NULL));
std::uniform_int_distribution<int> dice(1, max_roll);
}
int roll() {
return dice(rng);
}
};
我遇到了“骰子”未定义的问题,即使它在我的构造函数中也是如此。 当我将分布定义移动到roll函数的开头时,它将起作用,但是当我这样做时,每次调用它都会得到相同的数字。 我已尝试按照该问题的答案进行操作,但无法解决。
正如德雷舍姆(Drescherjm)所指出的那样,骰子是变量中的局部变量。 您需要使它在ctor范围之外可以访问。我试图在这里重新设计您的程序。 我认为您想要的是一个随机数生成器,它生成从0到MR的整数值? 在这种情况下,您可以使用下面重新设计的程序:
#include <random>
#include <time.h>
#include <iostream>
class enemy {
private:
std::random_device rd;
int max_roll;
typedef std::mt19937 MyRng;
MyRng rng;
std::uniform_int_distribution<int> dice;
public:
enemy(int MR) : max_roll(MR), rng(rd()), dice(std::uniform_int_distribution<>(1, MR)){
rng.seed(::time(NULL));
}
int roll() {
return dice(rng);
}
};
int main()
{
enemy en(6);
std::cout << "Roll dice produced : " << en.roll() << std::endl;
return 0;
}
该程序是不言自明的。 如果不是,请告诉我,我可以帮助您解决。
我认为您的问题是您每次都生成相同的数字。
如果我是你,我会考虑使用rand()和time()之外的srand()
小说明:
如果要每次生成不同的随机数,则除了rand()函数外,还必须使用srand()函数。 为什么? 这是因为rand每次都会生成相同的伪随机数。
srand()应该收到一些在每个瞬间都有变化的东西,例如时间或PID(进程的id)
在我看来,使用时间非常容易:(以下示例使用<ctime>
可能是解决此问题的一种方式。)
1)您需要创建一个类型为time_t的辅助变量,该变量将包含一个种子,具体取决于time()函数调用。
2)time()函数返回一个指向time_t的指针,因此您在以后的调用中通过引用time()函数来传递前一个变量。
3)之后,您调用srand()函数,该函数收到unsigned类型的种子。 因此,您可以传递辅助变量,并在传递变量时直接在srand()调用上进行无符号类型的转换。
#include <cstdlib>
#include <ctime>
time_t seconds;
time(&seconds);
// We create a seed that change each time that we run the code
srand((unsigned)seconds);
最后,每当您想要一个伪随机数时,只需调用rand()。
请注意,由于我们首先调用srand(),因此rand()可以生成不同的伪随机种子,而无需事先调用srand()函数,它将是相同的种子。
例如,我们假设您想掷骰一次,但您希望这些掷是随机的,而不是每次都不相同:您可以通过使用%数学运算来生成它,剩下的就是除数其他。
关于范围,如果要不包括0:
int die_throw = rand() % number;
您将获得一个介于0和1之间的伪随机数。如果您不想包含零,则可以执行以下操作:在获得种子后添加一个数字
int die_throw = (rand() % number)+1;
// you generate a seed between 1 and number
有关更多信息,您可以阅读:
希望这个答案对您有所帮助。 干杯
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.