如何在c ++中使用solo序列生成分布均匀的正态分布?

时间:2017-01-20 16:15:01

标签: 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_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;
}

我使用此site (Sobol)上的以下代码生成了一个低差异序列。 我用它来播种发电机。但输出是某种奇怪的。有人能帮助我吗?

输出:

1.12279
0.302805
1.12279
0.302805
1.12279
0.302805
1.12279
0.302805
1.12279
0.302805
1.12279
0.302805
1.12279
0.302805
1.12279
0.302805
...

1 个答案:

答案 0 :(得分:1)

如果没有看到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;
  }

如果种子在两个值之间交替显示,您将获得您所看到的行为。

顺便说一下 - 在你的rmake文件/项目中包含cpp文件时,通常#include一个头文件(而不是一个cpp文件)。

此外,如果你看看如何调用代码,

thisV = i8_sobol_generate(1,n,0);

我们还没有澄清参数的含义。

如果你按照你的链接,有一些测试(woot!)与源代码。 其中一个叫做sorbol08测试,循环如下:

for(dim_num = 2; dim_num&lt; = DIM_MAX; dim_num ++)   {// ^ ----------     seed = 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 )

发送1作为第一个参数。这将使用此值调用测试函数。

我怀疑你应该尝试更高的尺寸 - 它确实很快就会骑行。

请包含.hpp文件而不是cpp文件。 查看有关使用情况的测试线索。