package jnt.scimark2;
import java.util.Random;
/**
Estimate Pi by approximating the area of a circle.
How: generate N random numbers in the unit square, (0,0) to (1,1)
and see how are within a radius of 1 or less, i.e.
<pre>
sqrt(x^2 + y^2) < r
</pre>
since the radius is 1.0, we can square both sides
and avoid a sqrt() computation:
<pre>
x^2 + y^2 ≤ 1.0
</pre>
this area under the curve is (Pi * r^2)/ 4.0,
and the area of the unit of square is 1.0,
so Pi can be approximated by
<pre>
# points with x^2+y^2 < 1
Pi =~ -------------------------- * 4.0
total # points
</pre>
*/
public class MonteCarlo
{
final static int SEED = 113;
public static final double num_flops(int Num_samples)
{
// 3 flops in x^2+y^2 and 1 flop in random routine
return ((double) Num_samples)* 4.0;
}
public static final double integrate(int Num_samples)
{
Random R = new Random();
int under_curve = 0;
for (int count=0; count<Num_samples; count++)
{
double x= R.nextDouble();
double y= R.nextDouble();
if ( x*x + y*y <= 1.0)
under_curve ++;
}
return ((double) under_curve / Num_samples) * 4.0;
}
}