#java #random #seeding
#java #Случайный #заполнение
Вопрос:
Вкратце, у меня есть лабораторные задания по учебнику для этого класса, и в настоящее время я делаю модуль по объектам. В этой лаборатории я использую генератор случайных чисел, но из-за автоматической сортировки ему нужна повторяемость. Это делается путем заполнения с помощью 2, но, похоже, я не могу получить то, что хочет лаборатория, хотя моя программа функционирует именно так, как должна при обычных обстоятельствах. Вот инструкции и мой код:
Напишите программу, которая имитирует подбрасывание монетки для принятия решений. Входные данные — это количество необходимых решений, а выходные данные — либо орел, либо решка. Предположим, что входное значение больше 0.
Пример: если входные данные равны 3, выходные данные будут:
tails
heads
heads
Для воспроизводимости, необходимой для автоматической оценки, введите в программу значение 2. В реальной программе вы бы вводили текущее время. В этом случае выходные данные каждой программы были бы разными, что желательно, но не может быть автоматически классифицировано.
Примечание: Распространенной ошибкой учащихся является создание экземпляра Random перед каждым вызовом rand.nextInt(). Но заполнение должно выполняться только один раз, в начале программы, после чего rand.nextInt() может вызываться любое количество раз.
Ваша программа должна определить и вызвать следующий метод, который возвращает «орел» или «решка».
public static String HeadsOrTails(Random rand)
И вот что у меня есть на данный момент:
import java.util.Scanner;
import java.util.Random;
public class LabProgram {
public static String HeadsOrTails(Random rand) {
String coinFlipVal = "tails";
if (rand.nextInt(2) == 0) {
coinFlipVal = "heads";
}
return coinFlipVal;
}
public static void main(String[] args) {
Scanner key = new Scanner(System.in);
Random randGen = new Random(2); // Unique seed
int iDecisions = key.nextInt();
for (int i = 0; i < iDecisions; i ) {
System.out.println(HeadsOrTails(randGen));
}
}
}
Это делает именно то, что предполагается, в том смысле, что выдает случайный набор результатов «орел» или «решка» для любого количества итераций, которые я хочу, но не в том порядке, который ищет программа. Я поиграл со своим оператором if, установив для него значение 1 вместо нуля, используя оператор else if для tails и объявив coinFlipVal как «» и т.д. Я просто не знаю, как получить то, что они ищут. Любая помощь относительно того, что я упускаю из виду, очень ценится. И вот результаты отправки (которые дают то, что программа ожидает от выходных данных):
1: Сравните выходные данные 0/2, выходные данные отличаются. Смотрите основные моменты ниже. Ввод:
3
Ваш результат
tails
heads
tails
Ожидаемый результат
tails
heads
heads
2. Модульный тест
2 / 2
Ввод HeadsOrTails() 1
Ваш результат:
HeadsOrTails() with input 1 correctly returned:
tails
3. Модульный тест
0 / 3
Ввод HeadsOrTails() 5
Ваш результат:
HeadsOrTails() with input 5 incorrectly returned:
tails
heads
tails
heads
heads
4. Модульный тест
0 / 3
Ввод HeadsOrTails() 10
Ваш результат:
HeadsOrTails() with input 10 incorrectly returned:
tails
heads
tails
heads
heads
tails
tails
heads
tails
tails
Комментарии:
1. Попробуйте использовать метод nextboolean в Random.
2. Предложение @QuyNguyen2013 работает
3. Это работает в том смысле, что оно генерирует серию случайных орлов или решек, однако моя проблема в том, что эта программа автоматически классифицируется, что означает, что системе нужна определенная случайная последовательность (что для меня просто смешно). Моя программа сделала то, что должна была в первую очередь, просто не в той точной последовательности, которую хочет программа оценивания. Как сказано в инструкциях, заполнение с помощью 2 должно решить эту проблему, но я все еще получаю другую последовательность.
4. ?? Продолжайте цикл, пока ожидаемый результат не сравняется с фактическим результатом
5. Ваш инструктор намекнул на использование
rand.nextInt()
и не указал никаких аргументов, поэтому я не думаю, чтоnextBoolean()
это правильный подход. Попробуйте изменить свой тест сif (rand.nextInt(2) == 0)
на один изif ((rand.nextInt() % 2) == 0)
илиif ((rand.nextInt() amp; 1) == 0)
. Оба варианта сработали для меня в вашем тестовом примере 3.
Ответ №1:
У меня был тот же ответ, что и у вас, и я получил 10/10, единственное отличие в том, что я добавил оператор else после if;
public static String headsOrTails(Random rand){
String coinFlip; // no need to "initialize" as it is definitely assigned just below
if (rand.nextInt(2) == 0)
coinFlip = "heads";
else // Added code
coinFlip = "tails";
return coinFlip;
}
Ответ №2:
Это должно сработать
import java.util.Scanner;
import java.util.Random;
public class LabProgram {
public static String headsOrTails(Random rand) {
String coinflip = "tails";
if (rand.nextInt(2) == 0) {
coinflip = "heads";
}
return coinflip;
}
public static void main(String[] args) {
Scanner scnr = new Scanner(System.in);
Random rand = new Random(2);
int choice = scnr.nextInt();
for (int i = 0; i < choice; i ) {
System.out.println(headsOrTails(rand));
}
}
}