连续硬币翻转

时间:2014-02-26 18:42:18

标签: java random filewriter nanotime coin-flipping

我因缺乏Java知识而提前道歉。我是Java编程的新手,我正在尝试制作一个程序,我可以翻转硬币并计算硬币在N卷内落在头上的次数,测量这样做所需的时间,然后将其打印出来控制台,以便我可以将其保存在.txt文件中。我想我差不多了;我现在只是难以打印出来。任何帮助,将不胜感激!我被卡住了!

import java.util.Random;
import java.io.*;

public class RollGraph
{
    public static void flip(int n)
    {
        Random rnd = new Random();
        int roll = 0;
        int countHeads = 0;
        int headsInRow = 0;
        int headsOrTails = rnd.nextInt(2);

        while(roll<n){

            if(headsOrTails == 1){
                countHeads++;
                headsInRow++;
            }
            else{
                headsInRow=0;
            }
        }
        return;
    }

    public static void main(String[] arg) throws IOException
    {
        BufferedWriter writer = new BufferedWriter(
                new FileWriter( new File("data.txt")));
        long start,end,elapsed;
        int repeat = 20;
        double total;
        double average;

        for(int n=1;n<100;n++)
        {
            total = 0.0;
            for(int j=0;j<repeat;j++)
            {
                start = System.nanoTime();
                flip(n);
                end = System.nanoTime();
                elapsed = end - start;
                total += elapsed/1000000;
            }
            average = total/repeat;
            String line = n+"\t"+ average+"\t"+Math.log(average);
            System.out.println(line);
            writer.write(line);
            writer.newLine();
            writer.flush();
        }
        writer.close();
    }
}

3 个答案:

答案 0 :(得分:0)

在此循环flip中的while(roll<n){方法中, 这里你不增加roll变量。

这是我看到的一个问题。

检查flip方法的逻辑。对我来说似乎不对。

答案 1 :(得分:0)

我看到两个问题。首先,flip中有一个无限循环,因为你根本不会增加roll。增加它。

其次,你在这一行上有整数除法:

total += elapsed/1000000;

在Java中,划分两个int必须产生int,所以你可能会在这里获得一堆零。使用double字面值或将elapsed转换为double来执行浮点运算。

total += elapsed/1000000.0;

OR

total += (double) elapsed/1000000;

答案 2 :(得分:0)

除了已经提到的无限循环和分割问题之外,如果你想让你的打印线条更清洁,我建议使用BigDecimal来围绕你的双打:

String line = n+"\t"+ BigDecimal.valueOf(average).setScale(5, BigDecimal.ROUND_HALF_UP) + "\t"+ BigDecimal.valueOf(Math.log(average)).setScale(5, BigDecimal.ROUND_HALF_UP);
相关问题