Monte Carlo Pi 不准确
Monte Carlo Pi not accurate
我的 Monte Carlo Pi 程序无法正确计算。
基本上,pi 目前只显示最多 2 个小数点,我觉得计算有问题,因为随着数字越来越大,最接近的 pi 计算是 2.98-3.04。
我的代码贴在下面。
static void Main(string[] args)
{
double n;
double count;
double c = 0.0;
double x = 0.0, y = 0.0;
double pi;
string input;
Console.WriteLine("Please input a number of dots for Monte Carlo to calculate pi.");
input = Console.ReadLine();
n = double.Parse(input);
Random rand = new Random();
for (int i = 1; i < n; i++ )
{
x = rand.Next(-1, 1);
y = rand.Next(-1, 1);
if (((x * x) + (y * y) <= 1))
c++;
pi = 4.0 * ( c / i );
Console.WriteLine("pi: {0,-10:0.00} Dots in square: {1,-15:0} Dots in circle: {2,-20:0}", pi, i, c);
}
}
这些电话
x = rand.Next(-1, 1);
y = rand.Next(-1, 1);
给你一个整数。但是你需要 doubles
:
x = rand.NextDouble() * 2 - 1;
y = rand.NextDouble() * 2 - 1;
随机数应该在0和1之间而不是-1和1之间生成。
将此固定版本的代码用作学生的 "mysterious code"。
using System;
namespace mysCode
{
class Program
{
static double euclideanDistance(double x1, double y1, double x2, double y2)
{
double dX = x2 - x1;
double dY = y2 - y1;
return Math.Sqrt(dX * dX + dY * dY);
}
static void Main(string[] args)
{
double n;
double c = 0.0;
double x = 0.0, y = 0.0;
double result;
string input;
Console.WriteLine("Quick, pick an integer");
input = Console.ReadLine();
n = double.Parse(input);
Random rand = new Random();
for (int i = 1; i <= n; i++)
{
x = rand.NextDouble();
y = rand.NextDouble();
if (euclideanDistance(x, y, 0, 0) <= 1)
c++;
result = 4.0 * (c / i);
Console.WriteLine("Result: " + result);
}
Console.ReadKey();
}
}
}
它的覆盖速度非常慢,我在 1M 次迭代后得到 3.14152314152314。
我的 Monte Carlo Pi 程序无法正确计算。 基本上,pi 目前只显示最多 2 个小数点,我觉得计算有问题,因为随着数字越来越大,最接近的 pi 计算是 2.98-3.04。
我的代码贴在下面。
static void Main(string[] args)
{
double n;
double count;
double c = 0.0;
double x = 0.0, y = 0.0;
double pi;
string input;
Console.WriteLine("Please input a number of dots for Monte Carlo to calculate pi.");
input = Console.ReadLine();
n = double.Parse(input);
Random rand = new Random();
for (int i = 1; i < n; i++ )
{
x = rand.Next(-1, 1);
y = rand.Next(-1, 1);
if (((x * x) + (y * y) <= 1))
c++;
pi = 4.0 * ( c / i );
Console.WriteLine("pi: {0,-10:0.00} Dots in square: {1,-15:0} Dots in circle: {2,-20:0}", pi, i, c);
}
}
这些电话
x = rand.Next(-1, 1);
y = rand.Next(-1, 1);
给你一个整数。但是你需要 doubles
:
x = rand.NextDouble() * 2 - 1;
y = rand.NextDouble() * 2 - 1;
随机数应该在0和1之间而不是-1和1之间生成。 将此固定版本的代码用作学生的 "mysterious code"。
using System;
namespace mysCode
{
class Program
{
static double euclideanDistance(double x1, double y1, double x2, double y2)
{
double dX = x2 - x1;
double dY = y2 - y1;
return Math.Sqrt(dX * dX + dY * dY);
}
static void Main(string[] args)
{
double n;
double c = 0.0;
double x = 0.0, y = 0.0;
double result;
string input;
Console.WriteLine("Quick, pick an integer");
input = Console.ReadLine();
n = double.Parse(input);
Random rand = new Random();
for (int i = 1; i <= n; i++)
{
x = rand.NextDouble();
y = rand.NextDouble();
if (euclideanDistance(x, y, 0, 0) <= 1)
c++;
result = 4.0 * (c / i);
Console.WriteLine("Result: " + result);
}
Console.ReadKey();
}
}
}
它的覆盖速度非常慢,我在 1M 次迭代后得到 3.14152314152314。