Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用相同的生成器避免使用相同的随机数<;随机>;c++;11_C++_C++11_Random - Fatal编程技术网

C++ 使用相同的生成器避免使用相同的随机数<;随机>;c++;11

C++ 使用相同的生成器避免使用相同的随机数<;随机>;c++;11,c++,c++11,random,C++,C++11,Random,我有一个类,它有一个随机引擎生成器对象和函数,返回表示不同分布但使用相同生成器的函数 foo.hpp: class Foo { private: default_random_engine generator; function<float()> sample_pdf1(); class-Foo{ 私人: 默认的随机引擎生成器; 函数示例_pdf1(); foo.cpp: function<float()> Foo::sample_pdf1() { fl

我有一个类,它有一个随机引擎生成器对象和函数,返回表示不同分布但使用相同生成器的函数

foo.hpp:

class Foo {
private:
  default_random_engine generator;
  function<float()> sample_pdf1();
class-Foo{
私人:
默认的随机引擎生成器;
函数示例_pdf1();
foo.cpp:

function<float()> Foo::sample_pdf1()  {
  float mean = 3.0f;
  float stddev = 1.0f;
  normal_distribution<float> dist(mean,stddev);
  return bind(dist,generator);
}
函数Foo::sample_pdf1(){
浮动平均值=3.0f;
浮动标准差=1.0f;
正态分布距离(平均值,标准差);
返回绑定(dist,generator);
}
如果我这样做:

Foo myFoo;
cout << myFoo.sample_pdf1()() << endl;
cout << myFoo.sample_pdf1()() << endl;
foomyfoo;

cout问题在于代码通过值绑定生成器。函数返回的每个采样器都有自己的生成器副本。所有这些副本都有相同的种子。生成器是确定性的:如果使用相同的种子初始化一个生成器,则会得到相同的数字序列

您可以通过引用绑定生成器:
bind(dist,std::ref(generator));
。这样,两个采样器将使用同一个生成器,而不是使用各自的副本

或者,您可以为每个采样器设定不同的生成器,如下所示

function<float()> Foo::sample_pdf1()  {
  // a source of entropy to obtain seeds
  static std::random_device entropy;

  float mean = 3.0f;
  float stddev = 1.0f;
  normal_distribution<float> dist(mean,stddev);

  // seed a new generator for this sampler
  auto generator = default_random_engine(entropy());
  return bind(dist,generator);
}
函数Foo::sample_pdf1(){
//获取种子的熵源
静态std::随机_设备熵;
浮动平均值=3.0f;
浮动标准差=1.0f;
正态分布距离(平均值,标准差);
//为这个采样器安装一个新的发生器
自动生成器=默认的随机引擎(熵());
返回绑定(dist,generator);
}