我正在尝试创建一个随机数生成器对象,该对象将在应用程序的生命周期内存在。我希望有一个名为 number_generator() 的公共(public)接口(interface)函数,它应该在调用时返回一个随机数。
请注意下面的 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() 的公共(public)接口(interface):
#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
谢谢!
最佳答案
在
class random_generator
你在构造函数中初始化了一个生成器:
gen_type number_generator(gen, dist);
然后立即忘掉它。 如果您想记住它,请将其设为成员变量。
class random_generator
{
//...
private:
//...
gen_type number_generator;
};
在 main
中你很高兴 Larry 使用
std::cout << number_generator() << std::endl;
所以,在类(class)里放一个合适的成员:
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;
}
顺便说一句,考虑学习如何将实现放在 cpp 文件中,而不是放在标题中。
关于c++ - 将boost随机代码转换为类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19574285/