gpt4 book ai didi

c++ - 尝试生成随机变量时获取 "-nan(ind)"

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:50:31 27 4
gpt4 key购买 nike

我正在尝试通过使用极坐标以及平均值和西格玛值生成两个标准正态变量 r1、r2 来生成随机变量。然而,当我运行我的代码时,我不断得到一个“-nan(ind)”作为我的输出。

我在这里做错了什么?代码如下:

static double saveNormal;
static int NumNormals = 0;
static double PI = 3.1415927;

double fRand(double fMin, double fMax)
{
double f = (double)rand() / RAND_MAX;
return fMin + f * (fMax - fMin);
}

static double normal(double r, double mean, double sigma) {
double returnNormal;
if (NumNormals == 0) {
//to get next double value
double r1 = fRand(0, 20);
double r2 = fRand(0, 20);
returnNormal = sqrt(-2 * log(r1)) * cos(2 * PI*r2);
saveNormal = sqrt(-2 * log(r1)) * sin(2 * PI*r2);
}
else {
NumNormals = 0;
returnNormal = saveNormal;
}
return returnNormal*sigma + mean;
}

最佳答案

因此,您正在使用 Box–Muller 方法对正态随机变量进行伪随机抽样。要使此转换生效,r1r2必须是 [0,1] 中均匀分布的独立变量。

相反,您的 r1/r2支持 [0,20],导致负数 sqrt argument 当 >1 时,这会给你 nans。替换为

double r1 = fRand(0, 1);
double r2 = fRand(0, 1);

此外,你应该使用 C++11 <random>为了更好的伪随机数生成;截至目前,您的 fRand由于rand()质量差-到- double相邻调用之间的转换和可能的虚假相关性。此外,您的函数缺少一些基本的错误检查并且严重依赖于全局变量并且本质上是线程不安全的。

仅供引用,这就是 C++11 版本的样子

#include <random>
#include <iostream>

int main()
{
auto engine = std::default_random_engine{ std::random_device{}() };
auto variate = std::normal_distribution<>{ /*mean*/0., /*stddev*/ 1. };

while(true) // a lot of normal samples ...
std::cout << variate(engine) << std::endl;
}

关于c++ - 尝试生成随机变量时获取 "-nan(ind)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47302815/

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