c#求圆周率问题

qq_24062975 2015-09-21 09:33:20
昨天看到用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]
...全文
719 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
devmiao 2015-09-22
  • 打赏
  • 举报
回复
int number = rand.NextDouble() * 2;
qq_24062975 2015-09-21
  • 打赏
  • 举报
回复
谢谢大家了,就是用蒙特卡洛算法的。
qq_24062975 2015-09-21
  • 打赏
  • 举报
回复
引用 1 楼 qbilbo 的回复:
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();
谢啦!自己太粗心了,没看到其他代码的不同。就只改了一处。
qbilbo 2015-09-21
  • 打赏
  • 举报
回复
你原来代码的主要问题: 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的内切圆内了。)。
老李家的小二 2015-09-21
  • 打赏
  • 举报
回复
if ((x-1)*(x-1) + (y-1)*(y-1) <= 1)满足这个条件,m才会加1 但是从程序分析,不会出现满足这个条件的数据 楼主分析一下,如何能找到(x-1)的平方+(y-1)的平方小于等于1的x和y吧
qbilbo 2015-09-21
  • 打赏
  • 举报
回复
用一楼回复的代码....,然后把for (int i = 0; i <= n; i++) 改成:for (int i = 0; i < n; i++) 。 因为是在你原来的基础上改的,所以有些地方漏改了。
qq_24062975 2015-09-21
  • 打赏
  • 举报
回复
引用 2 楼 qbilbo 的回复:
for (int i = 0; i <= n; i++) 改成:for (int i = 0; i < n; i++)
不是这样的啊,运行结果总是这样
qbilbo 2015-09-21
  • 打赏
  • 举报
回复
for (int i = 0; i <= n; i++) 改成:for (int i = 0; i < n; i++)
qbilbo 2015-09-21
  • 打赏
  • 举报
回复
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();

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧