matlab code to java translation for monte carlo simulation

时间:2015-01-15 02:47:18

标签: java matlab montecarlo

我正在尝试用MATLAB代码将monte carlo模拟编码为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);
    }
}

1 个答案:

答案 0 :(得分:2)

你的问题是转换为(int)。这会自动将结果向下舍入。如果删除了那些,那么你的MATLAB程序就完全等同于得到类似的结果(我得到了~35.8%)。尝试将lb更改为double值,并从随机分配中删除(int)强制转换。

当然,如果你打算上楼,那么你也需要编辑你的MATLAB代码,它可能也会给你~29%。

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