последовательное подбрасывание монеты

Заранее извиняюсь за незнание 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();
    }
}

person Bfrank    schedule 26.02.2014    source источник
comment
Вы должны указать, что именно не работает так, как вы думаете, что должны или чего именно вы хотите достичь, но не знаете, как.   -  person libik    schedule 26.02.2014
comment
Возможно, вы захотите увеличить свою переменную roll, теперь ваш цикл while будет работать вечно — при условии, что n начинается с 1 или более.   -  person Daniël Knippers    schedule 26.02.2014
comment
Ваш метод flip вообще ничего не возвращает.   -  person Elliott Frisch    schedule 26.02.2014


Ответы (3)


В методе flip в этом цикле while(roll<n){,
здесь вы не увеличиваете переменную roll.

Это одна проблема, которую я вижу.

Проверьте логику вашего метода flip. Не кажется мне правильным.

person peter.petrov    schedule 26.02.2014

Я вижу две проблемы. Во-первых, у вас есть бесконечный цикл в flip, потому что вы вообще не увеличиваете roll. Увеличьте его.

Во-вторых, у вас есть целочисленное деление в этой строке:

total += elapsed/1000000;

В Java деление двух int должно дать int, так что вы, вероятно, получите здесь кучу нулей. Используйте литерал double или приведите elapsed к double для выполнения арифметических операций с плавающей запятой.

total += elapsed/1000000.0;

OR

total += (double) elapsed/1000000;
person rgettman    schedule 26.02.2014

В дополнение к уже упомянутым проблемам с бесконечным циклом и делением, если вы хотите сделать свои строки печати чище, я рекомендую использовать 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);
person jlewkovich    schedule 26.02.2014