Застрял, пытаясь использовать случайный объект для моего введения в компьютерное программирование с помощью домашнего задания Java

#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));
  }
}
}