Проблема:
У меня проблемы с вычислением целочисленного деления и отображением как Double (с плавающей запятой).
При меньших числах он отображается как с плавающей запятой, но кажется, что округляет значение до 11.0, 9.0, 28.0. После попытки решить проблему с помощью других сообщений StackO, я не могу добиться того, чтобы она была последовательной. Благодаря некоторым решениям я смог отобразить его как решение с плавающей запятой, но при выполнении команд тестирования результаты не совпадают, когда они отображаются как плавающие или нет.
Запрос на домашнее задание:
Напишите программу RandomWalkers.java, которая принимает два целочисленных аргумента командной строки 'r' и 'trials'. В каждом из испытаний независимых экспериментов моделируйте случайное блуждание, пока случайный бродяга не окажется на расстоянии Манхэттена r от начальной точки. Выведите среднее количество шагов.
По мере увеличения 'r' мы ожидаем, что случайный бродяга будет делать все больше и больше шагов. Но сколько еще шагов? Используйте RandomWalkers.java, чтобы сформулировать гипотезу о том, как среднее число шагов увеличивается как функция от 'r'.
Оценка неизвестного количества путем генерации случайных выборок и агрегирования результатов является примером моделирования по методу Монте-Карло - мощной вычислительной техники, широко используемой в статистической физике, вычислительных финансах и компьютерной графике.
Вы не можете вызывать библиотечные функции, кроме функций в java.lang (например, Integer.parseInt()
и Math.sqrt()
). Используйте только те функции Java, которые уже были представлены в курсе (например, циклы и условные выражения, но не массивы ).
Что я пробовал:
Прочитайте не менее 30+ различных страниц StackOverflow и других веб-сайтов о отображении целочисленного деления в виде числа с плавающей запятой (Double) и т. Д. И попробуйте все в них.
avgSteps = (double) totalNumSteps / trials;
изменение некоторых / всех переменных на Double
(totalNumSteps * 1.0) / trials;
(totalNumSteps + 0.0) / trials;
У меня иногда есть прорыв, но потом я проверяю его немного больше, и он терпит неудачу с некоторыми или всеми аргументами, передаваемыми приложению.
Код:
Приведенный ниже код представляет собой очищенную базовую версию кода, за исключением любых тестов сверху.
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 xx = 0;
int y = 0;
int yy = 0;
int numSteps = 0;
int totalNumSteps = 0;
double randNum = 0.0;
double avgSteps = 0.0;
for (long i = 0; i < trials; i++) {
while (Math.abs(x - xx) + Math.abs(y - yy) != r) {
randNum = Math.random();
if (randNum <= .25) {
// North
yy++;
} else if (randNum <= .5) {
// East
xx++;
} else if (randNum <= .75) {
// South
yy--;
} else {
// West
xx--;
}
numSteps++;
}
totalNumSteps += numSteps;
}
avgSteps = totalNumSteps / trials;
System.out.println("average number of steps = " + avgSteps);
}
}
Ожидаемый результат:
Это запрошенные параметры и ожидаемый результат, предоставленные в разделе «Домашнее задание».
~/Desktop/loops> java RandomWalkers 5 1000000
среднее количество шагов = 14,98188
~/Desktop/loops> java RandomWalkers 5 1000000
среднее количество шагов = 14,93918
~/Desktop/loops> java RandomWalkers 10 100000
среднее количество шагов = 59,37386
~/Desktop/loops> java RandomWalkers 20 100000
среднее количество шагов = 235,6288
~/Desktop/loops> java RandomWalkers 40 100000
среднее количество шагов = 949,14712
~/Desktop/loops> java RandomWalkers 80 100000
среднее количество шагов = 3775,7152
~/Desktop/loops> java RandomWalkers 160 100000
среднее количество шагов = 15113,61108
дипломная работа (фактический результат)
Проверка правильности RandomWalkers
Выполнено 7 полных тестов.
Тест 1: проверка формата вывода
% java RandomWalkers 5 10000
среднее количество шагов = 9,0
% java RandomWalkers 10 1000
среднее количество шагов = 18,0
% java RandomWalkers 20 123456
среднее количество шагов = 150,0
% java RandomWalkers 40 1
среднее количество шагов = 726,0
% java RandomWalkers 1 10000
среднее количество шагов = 1,0
% java RandomWalkers 0 333
среднее количество шагов = 0,0
==> прошло
Тест 2: проверьте среднее количество шагов (испытания = 10000)
* java RandomWalkers 1 10000
* java RandomWalkers 2 10000
- среднее количество шагов у студента = 2,000000
- истинное среднее количество шагов = 2.6666666666666665
- 99,99% доверительный интервал = [2.617080, 2.716254]
- правильное решение провалит этот тест по невезению примерно 1 раз в 10 000
java RandomWalkers 3 10000
- среднее число шагов студента = 3,000000
- истинное среднее количество шагов = 5,5709
- 99,99% доверительный интервал =
[5.443408, 5.698392]
- правильное решение не пройдёт этот тест по невезению примерно 1 раз в 10000
java RandomWalkers 4 10000
- среднее число шагов ученика =24,000000
- истинное среднее число шагов = 9,6808
- 99,99% доверительный интервал =
[9.444787, 9.916813]
- правильное решение не пройдёт этот тест по неудаче примерно 1 раз в 10000
java RandomWalkers 5 10000
- среднее число учеников = 7.000000
- истинное среднее число шагов = 14.9775
- 99,99% доверительный интервал =
[14.602377, 15.352623]
- правильное решение не пройдёт этот тест по случайности примерно 1 раз в 10000
java RandomWalkers 10 10000
- среднее число шагов студента = 52,000000
- истинное среднее количество шагов = 59,1465
- 99,99% доверительный интервал =
[57.612929, 60.680071]
- правильныйРешение провалит этот тест по случайности примерно 1 раз в 10 000
java RandomWalkers 20 10000
- среднее число шагов для студента = 390,000000
- истинное среднее количество шагов = 235,9058
- 99,99% доверительный интервал =
[229.737686, 242.073914]
- правильное решение не пройдёт этот тест по невезению примерно 1 раз в 10000
java RandomWalkers 40 10000
- среднее число шагов для студента = 2056.000000
- истинное среднее число шагов = 943,3142
- 99,99% доверительный интервал =
[918.599036, 968.029364]
- правильное решение не пройдёт этот тест по случайности примерно 1 раз в 10000
==> FAILED
Тест 3: проверить среднее количество шагов (радиус = 5) * java RandomWalkers 5 100
- среднее число студентовшагов = 11,000000 - истинное среднее число шагов = 14,9775 - доверительный интервал 99,99% = [11.226273, 18.728727]
- правильное решение не пройдёт этот тест по случайности примерно 1 раз в 10000
java RandomWalkers 5 1000
- среднее число учеников = 7.000000
- истинное среднее число шагов = 14,9775
- 99,99% доверительный интервал =
[13.791258, 16.163742]
- правильное решение не пройдёт этот тест по невезению примерно 1 раз в 10 000
java RandomWalkers 5 10000
- среднее число шагов студента = 5,000000
- истинное среднее число шагов = 14,9775
- доверительный интервал 99,99%=
[14.602377, 15.352623]
- правильное решение не пройдёт этот тест по случайности примерно 1 раз в 10000
java RandomWalkers 5 100000
- среднее число шагов для студента = 9,000000
- истинное среднее количество шагов = 14,9775
- 99,99% доверительный интервал =
[14.858876, 15.096124]
- правильное решение не выполнит этот тест поневезение примерно 1 раз в 10 000
java RandomWalkers 5 1000000
- среднее число шагов ученика = 21,000000
- истинное среднее числошагов = 14,9775
- 99,99% доверительный интервал =
[14.939988, 15.015012]
- правильное решение wпровалю этот тест по невезению примерно 1 раз в 10 000
==> FAILED
Тест 4: проверить среднее количествошаги (радиус = 0) * java RandomWalkers 0 1000
* java RandomWalkers 0 100
* java RandomWalkers 0 1
==> пройдено
Тест 5: проверьте, что среднее число шагов не является целым числом * java RandomWalkers 10 1000
- среднее число студентовшагов = 70,0 - правильное решение не пройдёт этот тест менее 1 раза за 10000
==> FAILED
Тест 6: проверьте, что программа выдает разные результаты каждый раз * java RandomWalkers 10 10000
[ repeated twice ]
* java RandomWalkers 20 1000
[ repeated twice ]
* java RandomWalkers 40 2000
[ repeated twice ]
==> пройден
Тест 7: проверьте случайностьсреднего числа шагов, когда испытания = 1 * java RandomWalkers 2 1
[ repeated 1024 times ]
* java RandomWalkers 3 1
[ repeated 8192 times ]
* java RandomWalkers 4 1
[ repeated 65536 times ]
* java RandomWalkers 5 1
[ repeated 1048576 times ]
==> пройдено
Всего RandomWalkers:4/7 испытаний пройдено!