c ++使用单个生成器从多个范围中提升随机整数

时间:2016-06-22 15:59:32

标签: c++ boost random

使用boost::random我试图从不同范围采样均匀分布的整数集,但使用相同的基础随机数生成器。对于每个范围,我定义了一个返回随机数的不同函数。 但是,似乎每个函数都返回相同的数字。

说明方法的一个例子:

        { 
            $('#accordion').append($('<h3>').html(Agency));  
            if (Icon == 1) {
                $('h3') .addClass('Icon');
            }    
            AccordionChild = $('<div>');                                                                        
        }
        AccordionChild.append("<div>").html(ToolsList);
        $('#accordion').append(AccordionChild);
    });
}

输出结果为:

#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/random.hpp>

struct RandomNumberGenerator {
  boost::mt19937 generator;

  RandomNumberGenerator(long seed) {
    generator.seed(seed);
  }

  boost::function<int()> getRandomFunctionInt(int min, int max) {
    boost::uniform_int<> uni_dist(min, max);
    boost::variate_generator<boost::mt19937&, boost::uniform_int<> > uni(generator, uni_dist);

    boost::function<int()> f;
    f = boost::bind(uni_dist, generator);
    return f;
  }
};

int main (int argc, char* argv[]) {
  RandomNumberGenerator rng(1729);
  boost::function<int()> runif1 = rng.getRandomFunctionInt(0,  1000);
  boost::function<int()> runif2 = rng.getRandomFunctionInt(0, 10000);

  for (int i=0; i<10; ++i) {
    std::cout << runif1() << ", " << runif2() << std::endl;
  }
}

有没有办法解除相关功能?为了实验的可重复性,我想使用单个种子。

1 个答案:

答案 0 :(得分:0)

f = boost::bind(uni_dist, generator);

您需要传递对生成器的引用。现在,您正在传递生成器的副本,这意味着每个f对象都有一个初始状态的生成器副本。

f = boost::bind(uni_dist, boost::ref(generator));

使用Lambdas的不同版本会使歧义更加明显(并且更易于检测/解析):

f = [uni_dist, this] {return uni_dist(generator);};

此外,c ++ 11引入了<random>标头,它提供了所有相同的功能以及boost random标头提供的更多功能,因此没有任何理由继续使用boost版本。