当前位置: 代码迷 >> C# >> c#求圆周率有关问题
  详细解决方案

c#求圆周率有关问题

热度:300   发布时间:2016-05-05 02:50:36.0
c#求圆周率问题
昨天看到用c++实现的求圆周率的代码,自己就想用c#写个小程序,可是求随机数这块有问题,到这就不知道该怎么改了,麻烦大家帮看看应该怎么写这个代码,我的代码如下[code=csharp static void Main(string[] args)
        {
            double j, k, x, y,p,t;
            int m = 0;
            Console.WriteLine("请输入实验次数:");
            string  str = Console.ReadLine();
            int n = Convert.ToInt32(str);
            Random rand = new Random();
            for (int i = 0; i <= n; i++)
            {
                int number = rand.Next(2);
                j = 20000*number;
                k = 20000*number;
                x = j/10000.0;
                y = k/10000.0;
                if ((x-1)*(x-1) + (y-1)*(y-1) <= 1)
                {
                    m++;
                }
                Console.WriteLine("x={0},y={1}",x,y);
            }
            p = m/n;
            t = 4 * p;
            Console.WriteLine("落在圆区域的次数:"+m);
            Console.WriteLine("随机点落在圆区域的概率:"+p);
            Console.WriteLine("π的值为:"+t);
            Console.ReadLine();
        }][/code]
------解决思路----------------------
double x, y, p, t, m, n;

            Console.WriteLine("请输入实验次数:");
            string str = Console.ReadLine();
            n = Convert.ToDouble(str);
            Random rand = new Random();
            m = 0;
            for (int i = 0; i <= n; i++)
            {
                x = rand.NextDouble() * 2 - 1;
                y = rand.NextDouble() * 2 - 1;
                if (x * x + y * y <= 1)
                {
                    m++;
                }
                Console.WriteLine("x={0},y={1}", x, y);
            }
            p = m / n;
            t = 4 * p;
            Console.WriteLine("落在圆区域的次数:" + m);
            Console.WriteLine("随机点落在圆区域的概率:" + p);
            Console.WriteLine("π的值为:" + t);
            Console.ReadLine();
------解决思路----------------------
for (int i = 0; i <= n; i++)  改成:for (int i = 0; i < n; i++)
------解决思路----------------------
用一楼回复的代码....,然后把for (int i = 0; i <= n; i++)  改成:for (int i = 0; i < n; i++) 。

因为是在你原来的基础上改的,所以有些地方漏改了。
------解决思路----------------------
if ((x-1)*(x-1) + (y-1)*(y-1) <= 1)满足这个条件,m才会加1
但是从程序分析,不会出现满足这个条件的数据

楼主分析一下,如何能找到(x-1)的平方+(y-1)的平方小于等于1的x和y吧
------解决思路----------------------
你原来代码的主要问题:
1,number是int,所以取出的随机数只可能是0,1,2,就算x,y是double,你再怎么*20000,/10000它们的小数位还是0。打个断点看一下就行了。
2,m是int,而且m<n,所以m/n总归是:0。
3,看你的代码,你这个应该用蒙特卡罗方法计算圆周率,正方型边长为2。那x,y肯定是取2次随机数,而你的代码里x是等于y的,这个是有可能影响到结果的;另外,那个判断随机点是否在内切圆内的算法看起来有问题(我看下来应该是判断是否在边长为4的内切圆内了。)。
------解决思路----------------------
int number = rand.NextDouble() * 2;
  相关解决方案