我因缺乏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();
}
}
答案 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);