【问题标题】:matlab code to java translation for monte carlo simulation用于蒙特卡罗模拟的matlab代码到java翻译
【发布时间】:2015-03-13 09:49:00
【问题描述】:

我正在尝试将蒙特卡罗模拟从 MATLAB 代码编写为 java。 MATLAB 答案与 java 代码的答案不匹配。我应该得到大约 34%,但得到了 29%,我试图解决的问题的其他变体导致与我想得到的结果有 -5% 的差异。我编码错了吗?还是 java 中的 Random 类对于 monte carlo sim 来说不够随机?

MATLAB 代码:

01 meetings = 0;
02 for loop = 1:1000000
03     L = 30*rand;
04     B = 30*rand;
05     if B<L & L<B+7
06        meetings = meetings +1;
07     elseif L<B & L>B-5
08        meetings = meetings +1;
09     end
10 end
11 meetings/1000000

java代码:

import java.util.Random;

public class Malt {

    public static void main(String[] args) {

        double meetings = 0;
        int l = 0, b = 0;
        Random random = new Random();

        for(int i = 1; i < 1000000; i++){
            l = (int) (random.nextDouble()*30);
            b = (int) (random.nextDouble()*30);
            if((b<l)&&(l<(b+7)))
                meetings = meetings +1;
            else if((l<b)&&(l>(b-5)))
                meetings = meetings +1;
        }
        System.out.println(meetings/1000000);
    }
}

【问题讨论】:

  • 这些是汇总结果还是每个实现的单次运行的结果?

标签: java matlab montecarlo


【解决方案1】:

您的问题是转换为 (int)。这会自动将您的结果四舍五入。如果这些被删除,您将拥有与您的 MATLAB 程序完全等价的结果并得到类似的结果(我得到了 ~35.8%)。尝试将您的 lb 更改为 double 值并从随机分配中删除 (int) 演员表。

当然,如果你的意图是地板,那么你也需要编辑你的 MATLAB 代码,它可能也会给你大约 29%。

另外,如果您担心Random 的可靠性(在这里似乎可以正常工作),您可以尝试SecureRandom,它速度较慢但不确定性较低。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多