【问题标题】:NaN error for gaussian random distribution高斯随机分布的 NaN 误差
【发布时间】:2015-04-22 18:47:29
【问题描述】:

我在输出之间得到随机的 NaN。

Random Temp:61.816288952756864 'F
Random Temp:NaN 'F
Random Temp:NaN 'F
Random Temp:63.674960517071916 'F
Random Temp:NaN 'F
Random Temp:62.581425292320894 'F
Random Temp:58.21928355494033 'F
Random Temp:60.00714587886456 'F
Random Temp:NaN 'F
Random Temp:60.62983167247955 'F
Random Temp:62.74961457200155 'F
Random Temp:58.50731966210792 'F
Random Temp:NaN 'F
Random Temp:55.20026299393227 'F

这是我的代码:

public static double gaussRandom(double dAverage, double dStddev, Random timeRand){
    double iRandom1, iRandom2;
    double dRandom1, dRandom2, result;

    //iRandom1 = timeRand.nextInt();
    //dRandom1 = (double)iRandom1 /2147483647;
    //iRandom2 = timeRand.nextInt();
    //dRandom2 = (double)iRandom2 /2147483647;

    iRandom1 = timeRand.nextInt();
    dRandom1 = (double)iRandom1 /2147483647.0;
    iRandom2 = timeRand.nextInt();
    dRandom2 = (double)iRandom2 /2147483647.0;

    result = dAverage + dStddev * Math.sqrt(-2.0* Math.log(dRandom1))*Math.cos(6.28318531*dRandom2);

    return result;
}

public static void main(String [] args){

    int i, liSampleSize;
    double dAverage, dStddev, result;

    System.out.println("==========================\n");
    System.out.println("Gaussian numbers generator\n");
    System.out.println("==========================\n");

    liSampleSize = 24*4; // 24 hours every 15 mins;
    dAverage = 60; //Average temp;
    dStddev = 2; //standard deviation of 20;

    Random myRand = new Random();
    myRand.setSeed(System.currentTimeMillis());

    for(i = 0; i<liSampleSize;i++)
    {
        result = gaussRandom(dAverage,dStddev,myRand);
        System.out.println("Random Temp:"+ result +" 'F");
    }


}

如何修复此代码使其不生成 NaN?

【问题讨论】:

    标签: java random distribution nan gaussian


    【解决方案1】:

    在您的代码中,dRandom1 可以为负数,而实数只接受来自 (0, +inf) 的参数

    【讨论】:

    • 非常感谢您的帮助!
    • 我认为你的意思是 (0, +inf] 其中 0 是独占的。
    • @jaket 我的左边界是正确的,至于右边界我不同意包含 +inf ,因为它不是实数集的元素(但是在使用 IEEE754 时它可能有意义)。
    • log(0) 是 -inf,log(+inf) 是 +inf。根据 IEEE754,从技术上讲,两者都是合法的。在没有真正研究过 OPs 代码的情况下,我会假设他想要避免 inf 的原因与他想要避免 NaN 的原因相同。
    • 我同意,但是我认为在更高级别(数学)上提供错误原因会产生更清晰的答案,因为错误原因位于错误语句的数学逻辑中,而不是不是由于表示(因为没有实数集的表示会有所帮助)。
    猜你喜欢
    • 1970-01-01
    • 2012-03-14
    • 2014-03-09
    • 2020-08-24
    • 2015-09-20
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    相关资源
    最近更新 更多