Вот задание: для этой программы есть две "части". Первая часть проведет испытания и определит, сколько колпачков каждое испытание открывается, прежде чем найти выигрышную кепку. Победителем будет каждый судебный процесс (лицо). Количество проб, открытых каждым испытанием, записывается в файл. Вторая часть программы будет считывать значения и вычислять среднее значение. Среднее значение должно составлять от 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);
Кроме 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);
winner/counter
возвращает int не double (целочисленное деление, потому что оба операнда целые, поэтому результат усечен). Попробуй это:
winner/(double)counter
Это возвращает двойной.
for (randNum = randNumList.nextInt(6); randNum == 5; randNum++)
с помощью while (randNum != 5)
.
Файл cap.txt не содержит "5" => победитель = 0 и средний = 0/counter = 0 (всегда).