Моделирование случайного блуждания Монте-Карло

У меня проблемы с написанием кода для следующего упражнения:

Напишите программу RandomWalkers.java, которая принимает два целочисленных аргумента командной строки r и trials. В каждом из пробных независимых экспериментов моделируйте случайное блуждание до тех пор, пока случайный блуждающий не окажется на манхэттенском расстоянии r от начальной точки. Выведите среднее количество шагов. Предварительный просмотр изображения здесь

Запуск программы должен выглядеть следующим образом:

~/Desktop/loops> java RandomWalkers 5 1000000
average number of steps = 14.98188

~/Desktop/loops> java RandomWalkers 5 1000000
average number of steps = 14.93918

~/Desktop/loops> java RandomWalkers 10 100000
average number of steps = 59.37386

~/Desktop/loops> java RandomWalkers 20 100000
average number of steps = 235.6288

~/Desktop/loops> java RandomWalkers 40 100000
average number of steps = 949.14712

~/Desktop/loops> java RandomWalkers 80 100000
average number of steps = 3775.7152

~/Desktop/loops> java RandomWalkers 160 100000
average number of steps = 15113.61108

Я пытался реализовать код, но довольно скептически отношусь к своей логике кода.

public class RandomWalkers {
public static void main(String [] args){
    int r = Integer.parseInt(args[0]);
    int trials = Integer.parseInt(args[1]);
    int x = 0;
    int y = 0;
    int distance = 0;
    int sumOfSteps = 0;
    double averageSteps = 0;
    int steps = 0;
    for(int i = 1 ; i <=trials ; i++){
        while(distance!=r){
            double random = Math.random();
            if(random > 0 && random < 0.25){
                x = x + 1;
                steps++;
            }
            if(random > 0.25 && random < 0.50){
                x = x - 1;
                steps++;
            }
            if(random > 0.50 && random < 0.75){
                y = y + 1;
                steps++;
            }
            if(random > 0.75 && random < 1){
                y = y - 1;
                steps++;

            }
            distance = Math.abs(x+y);
        }
        sumOfSteps = sumOfSteps + steps;
    }
    averageSteps = (double)(sumOfSteps / trials);
    System.out.println("average steps" + averageSteps);
}}

Вот моя программа запуска:

~/IdeaProjects/MonteCarloSimulation/src$ java RandomWalkers 5 1000000
average steps27.0
~/IdeaProjects/MonteCarloSimulation/src$ java RandomWalkers 5 1000000
average steps7.0

Вы можете видеть, что средние шаги сильно отличаются от примера модели времени выполнения, который мне дал инструктор. Кроме того, мои средние шаги всегда относятся к целочисленному типу данных, даже если я установил, что переменная averageSteps должна быть двойной.


person Tr909    schedule 03.04.2019    source источник


Ответы (1)


В вашем коде есть несколько проблем. Прежде всего, вам необходимо сбрасывать переменные x, y, distance и steps после каждого испытания. Или, что еще лучше, определить и инициализировать их до 0 в начале цикла for, например:

for(int i = 1 ; i <=trials ; i++){
        int x = 0;
        int y = 0;
        int distance = 0;
        int steps = 0;

        [...]
}

Во-вторых, ваша реализация манхэттенского расстояния неверна. Эта строка должна читаться

distance = Math.abs(x) + Math.abs(y);

Что касается отсутствия значащих цифр после десятичного разделителя, в вашем коде вы приводите к удвоению результата целочисленной операции, которая возвращает целое число. Вам необходимо преобразовать одно из целых чисел в двойное перед выполнением фактической математической операции, например:

averageSteps = ((double)sumOfSteps / trials);
person lr1985    schedule 04.04.2019