昨天看到用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;