gpt4 book ai didi

c++ - 如何在 C++ 中使用 Sobol 序列生成分布良好的正态分布?

转载 作者:行者123 更新时间:2023-11-30 05:18:19 27 4
gpt4 key购买 nike

我有以下代码:

#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
...

最佳答案

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

我们还没有阐明参数的含义。

如果您点击您拥有的链接,可以使用源代码进行一些测试(哇哦!)。一个叫,测试sorbol08,循环如下:

for ( dim_num = 2; dim_num <= DIM_MAX; dim_num++ ) {//^---------- 种子 = 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 文件。查看测试以获取有关使用的线索。

关于c++ - 如何在 C++ 中使用 Sobol 序列生成分布良好的正态分布?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41767977/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com