我想创建一个类,只要我调用它就会返回一个随机数。但是当我将它放入循环时,它每次都返回相同的随机数。我播种了一次,但它仍然一遍又一遍地返回同一个。它只有当我关闭程序并再次打开它时才会有所不同。任何帮助将不胜感激。
**编辑
当我无法看到我每次都在调用它时。
RadomGenerator rg = new...
for(int i =0; i<10; i++){
rg.createRandomNumber(1,5);}
这是不是只对种子进行一次实现,然后多次调用createRandomNumber方法?
RandomGenerator::RandomGenerator()
{
seed = time(0);
}
int RandomGenerator::createRandomNumber(int start, int end)
{
std::function<int()> randomNumber = std::bind(std::uniform_int_distribution<int>(start,end),
mt19937(seed));
qDebug()<< "result" << randomNumber() ;
return randomNumber();
}
答案 0 :(得分:5)
你每次都播种它。
#include <random>
struct RandomGenerator {
std::mt19937 _engine;
std::uniform_int_distribution<int> _dist;
RandomGenerator(int start, int end)
: _engine { std::random_device{} () },
_dist(start, end)
{
}
int createRandomNumber()
{
return _dist(_engine);
}
};
请注意,为单个调用创建uniform_*_distribution
的实例实际上没用。
更不用说,将其包装在function<>
。
您通常可以使用
auto mygen = bind(, );
而不是整个班级,并使用它:
int this_is_random = mygen();
在C ++ 14中:
auto mygen = [ _engine = mt19937{ random_device{}() }, _dist = uniform_int_distribution<>(12, 42) ]() mutable {
return _dist(_engine);
};
答案 1 :(得分:0)
这是不是只对种子进行一次实现,然后多次调用createRandomNumber方法?
没有。在这一行中,您每次使用相同的mt19937
实例化seed
:
std::function<int()> randomNumber = std::bind(std::uniform_int_distribution<int>(start,end),
mt19937(seed));