C++ 如何用c+中的Sobol序列生成均匀正态分布+;?

C++ 如何用c+中的Sobol序列生成均匀正态分布+;?,c++,sequence,normal-distribution,seeding,C++,Sequence,Normal Distribution,Seeding,我有以下代码: #include <iostream> #include <vector> #include <random> // #include "halton.cpp" #include "sobol.cpp" int main() { int n=5000; double* thisV; thisV = i8_sobol_generate(1,n,0); std::mt19937 generator; std::normal_

我有以下代码:

#include <iostream>
#include <vector>
#include <random>
// #include "halton.cpp"
#include "sobol.cpp"

int main()
{
  int n=5000;
  double* thisV;
  thisV = i8_sobol_generate(1,n,0);

  std::mt19937 generator;
  std::normal_distribution<double> distribution(0,1.0);
  for (int i=0; i<n; i++) {
    generator.seed(thisV[i]);
    std::cout << distribution(generator) << std::endl;
  }

  return 0;
}

如果没有看到sobol.cpp文件的内容,我无法告诉您为什么会得到这些确切的数字, 然而 每次循环时,您都会对生成器进行重新播种

如果是std::mt19937发生器

  std::normal_distribution<double> distribution(0,1.0);
  for (int i=0; i<n; i++) {
    generator.seed(thisV[i]); //<------------
    std::cout << distribution(generator) << std::endl;
  }
我们还没有澄清参数的含义

如果您遵循已有的链接,那么源代码中会有一些测试(woot!)。 一个名为sorbol08的测试和循环如下:


for(dim_num=2;dim_num是
thisV[i]中的值)
正确吗?我没有安装您的库,但我可以告诉您,在每次迭代中为生成器设定种子可能不是您想要做的。设定种子一次,然后让它按原样运行。如果您坚持使用自己的生成器,就不用费事通过
std::mt19937
实现自己的生成器类。@KamilKoczurek:是的,thisV有一个正确的sobol序列。@FrançoisAndrieux:我认为你给了我正确的方法。有关于实现它自己的生成器类的信息吗?结果是,你不能用正常(有效)的sobol序列生成自定义分布C++分发的方法。你必须使用其他更原始的方法。请看我的答案。问题是我不太确定如何使用SOBOL序列来生成这个分布良好的正态分布。
  std::normal_distribution<double> distribution(0,1.0);
  for (int i=0; i<n; i++) {
    generator.seed(thisV[i]); //<------------
    std::cout << distribution(generator) << std::endl;
  }
thisV = i8_sobol_generate(1,n,0);
// <snip>

for ( i = 0; i <= 110; i++ )
{
  seed_in = seed;
  i8_sobol ( dim_num, &seed, r );

// ....
double *i8_sobol_generate ( int m, int n, int skip )