使用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;
}
}
有没有办法解除相关功能?为了实验的可重复性,我想使用单个种子。
答案 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版本。