Работа со случайными целыми числами

1

Вот задание: для этой программы есть две "части". Первая часть проведет испытания и определит, сколько колпачков каждое испытание открывается, прежде чем найти выигрышную кепку. Победителем будет каждый судебный процесс (лицо). Количество проб, открытых каждым испытанием, записывается в файл. Вторая часть программы будет считывать значения и вычислять среднее значение. Среднее значение должно составлять от 4,5 до 5,5, так как есть шанс выиграть 1 из 5.

Он компилируется и запускается, но среднее значение всегда равно 0.

Мой код:

  int randNum = 0; 
  Random randNumList = new Random(); 

  int counter = 0;
  Scanner in = new Scanner(System.in);
  System.out.println("How many trials will there be?");
  int trials = in.nextInt();

  int winner = 0;

  PrintWriter outFile = new PrintWriter (new File("cap.txt")); 
  //run trials
  for (int loop = 1; loop <= trials; loop++)    
  {  
    //select random number until 5 is selected
    randNum = randNumList.nextInt(6);
    for (randNum = randNumList.nextInt(6); randNum == 5; randNum++)
    { 
      randNum = randNumList.nextInt(6);
      counter++;
    }

    outFile.println(loop + " " + randNum);
  }   


  outFile.close ( );    //close the file when finished 

  String token = " ";
  Scanner inFile = new Scanner(new File("cap.txt")); 

  while (inFile.hasNext())
  {      
       token = inFile.next();
       if(token.equals("5"))
         winner++;  
  }

  double average = winner/counter;
  System.out.println("The average number is " + average);
  • 1
    Что не так с кодом? Вы пробовали даже компилировать / запускать его?
  • 1
    Какой у тебя актуальный вопрос? «посмотри на мой код» не вопрос ..
Показать ещё 7 комментариев
Теги:
random

3 ответа

0
Лучший ответ

Кроме INT/Int точности деления задачи, которая должна быть winner/(double)counter или (double)winner/counter попытаться изменить ваши внутренний for loop к do while во do while. В общем, предпочитайте while когда вы не знаете точное количество итераций.

Кроме того, randNumList.nextInt(6) - [0-5], поэтому есть 6 возможных результатов → есть шанс на выигрыш 1 из 6. Чтобы исправить это, используйте randNumList.nextInt(5) + 1

for (int loop = 1; loop <= trials; loop++) {  
    //select random number until 5 is selected
    do {
        randNum = randNumList.nextInt(5) + 1;
        counter++;
    } while (randNum != 5);

    outFile.println(loop + " " + randNum); //why here?? maybe you should add it below counter++;
}  

также if(token.equals("5")) не будет работать, поскольку вы пишете (loop + randNum), он должен работать, если вы используете outFile.println(randNum);

  • 0
    Спасибо, это очень помогло.
0

winner/counter возвращает int не double (целочисленное деление, потому что оба операнда целые, поэтому результат усечен). Попробуй это:

winner/(double)counter

Это возвращает двойной.

  • 0
    Спасибо. Я сделал это, но результат был 0,04. что еще я делаю не так?
  • 0
    Попробуйте изменить for (randNum = randNumList.nextInt(6); randNum == 5; randNum++) с помощью while (randNum != 5) .
0

Файл cap.txt не содержит "5" => победитель = 0 и средний = 0/counter = 0 (всегда).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню