蒙特卡罗Pi不准确

本文关键字:不准确 Pi 蒙特卡罗 | 更新日期: 2023-09-27 18:18:03

我的蒙特卡罗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);
    }
}

蒙特卡罗Pi不准确

这些调用

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。使用这个固定版本的代码作为学生的"神秘代码"。

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