我正在尝试创建一个随机数生成器对象,该对象将在应用程序的生命周期中存在。我希望有一个名为number_generator()的公共接口函数,它应该在调用时返回一个随机数。
请注意下面的main()函数编译得很好,产生了很好的随机数,但是底部是我无法工作的类:
#include <boost/random.hpp>
#include <iostream>
#include <ctime>
int main(int c, char** argv)
{
// Define a uniform random number distribution of integer values between MIN and MAX
const int MIN = 1;
const int MAX = 2147483648;
typedef boost::uniform_int<> distribution_type;
typedef boost::variate_generator<boost::mt19937&, distribution_type> gen_type;
distribution_type dist(MIN, MAX);
boost::mt19937 gen;
gen_type number_generator(gen, dist);
gen.seed(static_cast<unsigned int>(std::time(0))); // seed with the current time
// output random ints
for (int i=0; i<50; i++)
std::cout << number_generator() << std::endl;
}
这是问题所在,由于C ++知识有限,我无法获得number_generator()的公共接口:
#ifndef _random_generator_H_
#define _random_generator_H_
#include <boost/thread/thread.hpp>
#include <boost/random.hpp>
#include <ctime>
class random_generator
{
public:
random_generator() /* : MIN(1), MAX(2147483648)*/
{
distribution_type dist(MIN, MAX);
boost::mt19937 gen;
gen_type number_generator(gen, dist);
gen.seed(static_cast<unsigned int>(std::time(0))); // seed with the current time
}
private:
// define a uniform random number distribution of integer values between MIN and MAX
int MIN;
int MAX;
typedef boost::uniform_int<> distribution_type;
typedef boost::variate_generator<boost::mt19937&, distribution_type> gen_type;
};
#endif
谢谢!
答案 0 :(得分:1)
在
class random_generator
在构造函数中初始化生成器:
gen_type number_generator(gen, dist);
然后立即忘掉它。 如果您想记住,请将其设为成员变量。
class random_generator
{
//...
private:
//...
gen_type number_generator;
};
您在main
使用
std::cout << number_generator() << std::endl;
所以,在课堂上放一个合适的成员:
class random_generator
{
public:
//...
int next()
{
return number_generator();
}
private:
//...
gen_type number_generator;
};
然后你可以在main中使用它:
//relevant includes
int main(int c, char** argv)
{
random_generator numbers;
// output random ints
for (int i=0; i<50; i++)
std::cout << numbers.next() << std::endl;
}
BTW考虑学习如何将实现放在cpp文件中,而不是标题。