基本上,我必须进行1000次试验。每次试验都是在我成功挑选“带奖品的瓶盖”时。因此,每次获得奖品时,我都必须看到在我获得该奖项之前我经历了多少个瓶盖。我最终应该输出的是我平均需要多少个瓶盖才能找到奖金上限。
我无法在程序中获得平均数量的瓶子,而这正是我需要帮助的。我的平均水平到底是不正确的。至于文件的输入和输出,这是作业的一部分,我已经知道了,所以我不需要那里的帮助。还有一件事,前两行outputFile.println代码只是为了测试程序是否正常工作。
import java.io.IOException;
import java.io.PrintWriter;
import java.io.File;
import java.util.Scanner;
import java.util.Random;
public class BottleCapPrize
{
public static void main(String [] args) throws IOException
{
PrintWriter outputFile = new PrintWriter(new File("MonteCarlo.txt"));
Random randNum = new Random();
int bottleCapNumber = 0;
int wins = 0;
int capsOpened = 0;
for(int i = 1; i <= 1000; i++)
{
bottleCapNumber = randNum.nextInt(5);
while(bottleCapNumber != 0)
{
bottleCapNumber = randNum.nextInt(5);
capsOpened++;
}
if(bottleCapNumber == 0)
{
capsOpened++;
wins++;
}
}
outputFile.println(capsOpened);
outputFile.println(wins);
int averageNumberOfBottles = (int)(((double)wins / (double)capsOpened) * 10);
outputFile.println("The average amount of bottles that need to be opened are: " + averageNumberOfBottles);
outputFile.close();
Scanner inputFile = new Scanner(new File("MonteCarlo.txt"));
while(inputFile.hasNextLine())
{
String token = inputFile.nextLine();
System.out.println(token);
}
inputFile.close();
}
}
答案 0 :(得分:2)
虽然它可能不是问题的根源,但在我看来
while (bottleCapNumber != 0) {
bottleCapNumber = randNum.nextInt(5);
capsOpened++;
}
if (bottleCapNumber == 0) {
capsOpened++;
wins++;
}
可以用更直接的清除方式重写。由于在 while 语句结束时,bottleCapNumber
必须等于0
(否则,您仍然会在while语句中循环),它可以被重写。
while (bottleCapNumber != 0) {
bottleCapNumber = randNum.nextInt(5);
capsOpened++;
}
capsOpened++;
wins++;
由于添加的关联属性,可以很容易地重新排列
capsOpened++;
while (bottleCapNumber != 0) {
bottleCapNumber = randNum.nextInt(5);
capsOpened++;
}
wins++;
显而易见,您使用基于1的编号例程capsOpened
。
正如其他人所指出的那样,除了计算平均值之外,你正在强制整数除法,这意味着你不会产生非整数输出(结果只会是分工干净利落的次数)。这将大大改变答案。
您需要的是
double averageNumberOfBottles = ((double)capsOpened / wins);
请注意double
的{{1}}演员。这会强制capsOpened
作为实数值而不是整数值处理。由于capsOpened
现在被作为实数处理,因此除以整数也将产生实数。当然,你需要一个真实的变量来保存结果,所以你不要砍掉数字。
我也不清楚为什么你决定划分capsOpened
因为这会给你平均每个开帽数的胜利数。我以为你想要每场胜利的平均开盘数。引入一个狂野的“然后将其乘以10”可能是一个遗留下来,试图弄清楚出了什么问题,但你肯定不想要正确答案的10倍。
最后一个副业。虽然wins/capsOpened
是一个“ok”随机数生成器,但它不像其他一些选项那样是随机的。当然它是内置的,并且很快返回数字;但是,如果你真的想要一个更好(更慢)的随机数源,请使用java.util.Random
。在我的测试中,我通常会回来
java.secure.SecureRandom
这不足以确定输出差异的静态重要性,但它肯定表明如果with java.util.Random :
4.696
4.948
4.766
4.901
4.832
with java.secure.SecureRandom :
4.929
5.058
5.065
4.932
4.782
很少跨越5.0,java.util.Random
的随机性低于java.secure.SecureRandom
标记
答案 1 :(得分:1)
您正在计算每次赢取的上限,因此平均公式错误应该是
int averageNumberOfBottles = (capsOpened / wins);