介绍java作业

时间:2012-10-12 19:08:28

标签: java if-statement random for-loop

我的作业说明: http://media.orvsd.org/FLVS/backup-ap_computer_science_a_v9_gs_-20120821-1900/course_files/flvs/educator_apcsa_v9_gs/module05/rtfmod05/5.06_AssignmentInstructionsBottleCapPrize.pdf

基本上,我必须进行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();
}
}

2 个答案:

答案 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);