添加最后的平均值

时间:2013-12-30 01:39:24

标签: java

我无法添加我拥有的最后一个循环数。我没有任何想法如何包含最后一个数字,然后将其添加到double变量然后除以它以得到平均值。我会使用我的IDE来解决问题,但输入必须大约1000次试验才能准确。你可以清楚地看到,3.0或更高的10次试验不等于大约2.8。我只需要添加缺失的试验,然后计算平均值。

代码:

import java.util.*;

public class CalculatePI2

{ 

public static boolean ifitisInside (double xPosion, double yPosion)  

{  

    double distance = Math.sqrt((xPosion * xPosion) + (yPosion * yPosion));
    return (distance < 1.0);

}



public static double calculatePI (int numThrows)
{ 
    Random randomGen = new Random();    
    int hits = 0;
    double PI = 0;
     double Alpha=0;
     double average= 0;
    for( int m=0; m<10; m++)
    {
        Alpha=+PI;  
        average= m/Alpha;
        if(m>=0)
        {
            hits=0;
            PI=0;

    for (int i = 0; i <= numThrows; i++)

    { 

        double xPosion = (randomGen.nextDouble()) * 2 - 1.0;
        double yPosion = (randomGen.nextDouble()) * 2 - 1.0;
        if (ifitisInside(xPosion, yPosion))

        {
            hits++;
            double dthrows = numThrows;
            PI =+ (4.0 * (hits/dthrows));


        }
    }
           System.out.println("Trial["+m+"]: ="+ PI);

}



}
 System.out.println("Estimate:"+average);
return PI;
}
    public static void main (String[] args)
    {
        Scanner pie = new Scanner (System.in);
        System.out.println("This program approximates PI using the Monte Carlo method. By simulating throwing darts at a dartboard. ");
        System.out.print("Please enter number of throws: ");
        int numThrows = pie.nextInt();
        double PI = calculatePI(numThrows);




}
}

2 个答案:

答案 0 :(得分:0)

我认为你可以通过重新安排代码来解决这个问题:

public static double calculatePI (int numThrows)
{ 
    Random randomGen = new Random();    
    int hits = 0;
    double PI = 0;
    double Alpha=0;
    double average= 0;


    for( int m=0; m<10; m++)
    {

        for (int i = 0; i <= numThrows; i++)
        { 
            double xPosion = (randomGen.nextDouble()) * 2 - 1.0;
            double yPosion = (randomGen.nextDouble()) * 2 - 1.0;
            if (ifitisInside(xPosion, yPosion))
            {
                hits++;
                double dthrows = numThrows;
                PI += (4.0 * (hits/dthrows)); // NOTE: += not =+
            }
        }

        Alpha+=PI;  // NOTE += not =+
        average= m/Alpha;
        if(m>=0)
        {
            hits=0;
            PI=0;
        }
        System.out.println("Trial["+m+"]: ="+ PI);

    }
}

这样,平均值是在每次试验后而不是之前计算的。另外,我对这个特定的算法知之甚少,但我认为这一行:

average=m/Alpha;

应该是:

average=Alpha/m

答案 1 :(得分:0)

从内循环中取出平均计算。此外,循环不变量从0到<0。 numthrows,不是&lt; = numthrows。此外,您的10个试验中的每一个都需要对变量进行初始化,因此需要在循环内移动。

double sumPiOverMTrials = 0;
for( int m=0; m<10; m++)
{
  double hits = 0;
  for (int i = 0; i < numThrows; i++) { 
    double xPosition = (randomGen.nextDouble()) * 2 - 1.0;
    double yPosition = (randomGen.nextDouble()) * 2 - 1.0;
    if (ifitisInside(xPosition, yPosition))
    {
      hits++;
    }
  }
  double pi = 4.0 * hits/numthrows;
  System.out.println("Trial["+m+"]: ="+ pi);
  sumPiOverMTrials += pi;
}
System.out.println("Average over "+m+" trials ="+ sumPiOverMTrials/10);