我有以下代码:
#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
...
答案 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文件。 查看有关使用情况的测试线索。