我正在尝试从MATLAB代码将蒙特卡洛模拟编码为Java。 MATLAB的答案与Java代码的答案不匹配。我应该获得大约34%的收入,但获得29%的收入,而我尝试解决的其他问题导致与我想得到的结果相差-5%。我编码有误吗?还是Java中的Random类不够适合蒙特卡罗模拟?

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);
    }
}

最佳答案

您的问题是强制转换为(int)。这会自动将结果四舍五入。如果这些都被删除,您将具有与MATLAB程序完全相同的功能,并且得到相似的结果(我得到〜35.8%)。尝试将lb的值更改为double,并从随机分配中删除(int)强制转换。

当然,如果您打算使用地板,那么您也需要编辑MATLAB代码,它可能还会给您带来29%的收益。

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

关于java - Matlab代码将Java翻译为蒙特卡洛模拟,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27956026/

10-12 22:07