c++ - 将boost随机代码转换为类对象

标签 c++ boost random

我正在尝试创建一个随机数生成器对象,该对象将在应用程序的生命周期内存在。我希望有一个名为 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/

相关文章:

c++ - pthread_cond_wait 和 pthread_cond_signal 的性能

c++ - 关于 boost::lock_guard 和 boost::unique_lock

java - 用连续的数字播种 java.util.Random

c++ - 需要在 Singleton 类中私有(private)化赋值运算符

c++ - 使用 int 数组作为键的二叉树(欧氏距离)?

c++ - 避免在 vista 中使用 UAC

c++ - 在编译 boost 时定义 BOOST_DISABLE_ABI_HEADERS 会带来什么危害?

c++ - boost mpl序列模式匹配

java - 有没有办法让 g.drawstring 显示随机字符串

c++ - 如何在 Linux 上用 gcc 编译 intel rand_sse?