Перевод кода из Matlab в Java для моделирования Монте-Карло

Я пытаюсь закодировать симуляцию Монте-Карло на Java из кода MATLAB. Ответ MATLAB не соответствует ответу кода Java. Я должен получить около 34%, но вместо этого получаю 29%, другие варианты проблемы, которые я пытаюсь решить, приводят к разнице в -5% от того, что я предполагаю получить. Я что-то неправильно закодировал? или случайный класс в java недостаточно случайный для симулятора Монте-Карло?

КОД 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);
    }
}

person Raz    schedule 15.01.2015    source источник
comment
Это агрегированные результаты или результаты отдельных прогонов каждой реализации?   -  person J0e3gan    schedule 15.01.2015


Ответы (1)


Ваша проблема - это приведение к (int). Это автоматически округляет ваши результаты в меньшую сторону. Если они удалены, у вас есть точный эквивалент вашей программе MATLAB и аналогичные результаты (я получаю ~ 35,8%). Попробуйте изменить значения l и b на double и удалить (int) приведение из случайного назначения.

Конечно, если вы намерены выйти на пол, вам также нужно отредактировать свой код MATLAB, и это, вероятно, также даст вам ~ 29%.

Кроме того, если вас беспокоит надежность Random (которая, похоже, здесь работает нормально), вы можете попробовать SecureRandom, которая работает медленнее, но менее детерминирована.

person k_g    schedule 15.01.2015