static void Main(string[] args)
{
int radius = 9000;
Trace.WriteLine(CircleAreaByMonteCarlo(radius, 10000));
Trace.WriteLine(Math.PI * radius * radius);
Func<double, double, double, bool> limFunc = (x, y, max) => (x * x + y * y) < max;
Trace.WriteLine(MonteCarlo(radius, radius, limFunc, 10000));
Console.ReadKey();
}
/// <summary>
/// S = Ssq * K / N
/// </summary>
/// <param name="r">radius</param>
/// <returns>Area of circle calculated by the Monte-Carlo method</returns>
static double CircleAreaByMonteCarlo(double radius, int number)
{
double max = radius * radius;
Random rnd = new Random((int)DateTime.Now.Ticks >> 32);
var k = (double)Enumerable.Repeat(0, number).
Select(x => new { x = rnd.Next(0, (int)radius), y = rnd.Next((int)radius) }).
Count(coord => (coord.x * coord.x + coord.y * coord.y) < max);
return 4 * max * k / number;
}
/// <summary>
/// Calculates the area of a shape by Monte-Carlo method (S = Ssq * K / N)
/// </summary>
/// <param name="maxX">maximum of X</param>
/// <param name="maxY">maximum of Y</param>
/// <param name="limFunc">the function which describes a shape</param>
/// <param name="number">number of iterations</param>
/// <returns>Calculated area</returns>
static double MonteCarlo(double maxX, double maxY, Func<double, double, double, bool> limFunc, int number)
{
Random rnd = new Random((int)DateTime.Now.Ticks >> 32);
var k = Enumerable.Repeat(0, number).
Select(x => new { x = rnd.Next(0, (int)maxX), y = rnd.Next((int)maxY) }).
Count(coord => limFunc(coord.x, coord.y, maxX * maxY));
return 4 * maxX * maxY * k / number;
}
254761200
254469004,940773
253368000