【问题标题】:consecutive coin flip连续抛硬币
【发布时间】:2014-02-26 18:42:17
【问题描述】:

对于我缺乏 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();
    }
}

【问题讨论】:

  • 您应该指定您认为应该实现的究竟是什么,或者您想要实现什么而不是如何实现。
  • 您可能想要增加您的roll 变量,现在您的while 循环将永远运行——假设n 从1 或更多开始。
  • 您的翻转方法根本不返回任何内容。

标签: java random filewriter nanotime coin-flipping


【解决方案1】:

在这个循环中的flip方法while(roll&lt;n){
在这里你不要增加 roll 变量。

这是我看到的一个问题。

检查flip 方法的逻辑。我觉得不合适。

【讨论】:

    【解决方案2】:

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

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

    total += elapsed/1000000;
    

    在 Java 中,除以两个 ints 必须得到一个 int,所以你可能会在这里得到一堆零。使用 double 文字或将 elapsed 转换为 double 来执行浮点运算。

    total += elapsed/1000000.0;
    

    total += (double) elapsed/1000000;
    

    【讨论】:

      【解决方案3】:

      除了已经提到的无限循环和除法问题,如果你想让你的打印线更干净,我建议使用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);
      

      【讨论】:

        猜你喜欢
        • 2022-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-25
        • 2012-12-02
        • 1970-01-01
        • 2012-06-24
        • 1970-01-01
        相关资源
        最近更新 更多