Моделирование случайной прогулки Монте-Карло - PullRequest
0 голосов
/ 03 апреля 2019

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

Напишите программу RandomWalkers.java, которая принимает два целочисленных аргумента командной строки r и испытания.В каждом из испытаний независимых экспериментов моделируйте случайное блуждание, пока случайный бродяга не окажется на расстоянии Манхэттена 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, она должна быть двойной.

1 Ответ

0 голосов
/ 04 апреля 2019

В вашем коде есть несколько проблем. Прежде всего вам необходимо сбрасывать переменные 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...