<random> 在 C++ 类中使用
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所指出的,dice是ctor中的一个局部变量。您需要使其在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()。
注意,rand()可以生成一个不同的伪随机种子,因为我们首先调用了srand(),而之前没有调用srand(()函数,它将是相同的种子。
例如,我们假设你想多次投掷骰子,但你希望这些投掷是随机的,而不是每次都一样:你可以通过使用%math运算来生成骰子,该运算将数字除以其他部分。
关于范围,如果你想包括0或不包括:
int die_throw = rand() % number;
您将得到一个介于0和数字-1之间的伪随机数如果你不想包括零,你可以在获得种子后添加一个数字
int die_throw = (rand() % number)+1;
// you generate a seed between 1 and number
有关更多信息,您可以阅读:
rand()函数,包括范围srand()函数
我希望这个答案对你有帮助。干杯
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- <random>在实践中应该实际使用哪个随机数引擎? std::mt19937?
- 是否可以为boost::random::uniform_int_distribution<>设置确定性种子?
- 'generate'不是窗口头文件中'std::random_device'的成员<random>
- 数组打印"random"值时出现问题
- 如何显式调用运算符<<
- 使用""的不可重现的随机数<random>
- <random> 尽管不是常量,但所有发行版都是线程安全的吗?
- 从时间生成'random'数字?
- 无法在 c++ 中包含"random"头文件
- Nemiver 找不到文件 /build/glibc-LK5gWL/glibc-2.23/stdlib/random.c
- 如何在 c++ 中正确读取 GRC 块"Random Source"的字节输出数据到自己的 OOT 块中?
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;