Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
提高C#循环的效率_C#_Loops_Pi - Fatal编程技术网

提高C#循环的效率

提高C#循环的效率,c#,loops,pi,C#,Loops,Pi,我正在做一个程序,通过将给定半径的多边形的边数增加到一个非常大的数值,取面积,除以半径的平方来估计pi。我有以下资料: double radius = 5; for (double sides = 3;sides < 10000;sides++) { double pi_est = ((radius * radius * sides * Math.Sin((360 / sides)*(

我正在做一个程序,通过将给定半径的多边形的边数增加到一个非常大的数值,取面积,除以半径的平方来估计pi。我有以下资料:

            double radius = 5;

            for (double sides = 3;sides < 10000;sides++)
            {
                double pi_est = ((radius * radius * sides * Math.Sin((360 / sides)*(Math.PI/180))) / 2) / (radius * radius);
                richTextBox1.AppendText(pi_est+"\n");
            }
双半径=5;
用于(双面=3;侧面<10000;侧面++)
{
双圆周率=((半径*半径*边*数学Sin((360/边)*(数学pi/180))/2)/(半径*半径);
richTextBox1.AppendText(pi_est+“\n”);
}

到目前为止,这大约需要5秒钟才能完成。有什么我可以重新编写的东西可以提高我的循环的效率吗?

对于初学者,您可以预先计算循环外的radius*radius


此外,如果循环内部不需要,请在循环外部更新富格文本框,并在内部使用StringBuilder。

对于初学者,您可以预先计算循环外部的半径*半径


此外,如果循环内部不需要,请在循环外部更新富文本框,并在循环内部使用StringBuilder。

AppendText
调用将花费大量时间,因为它意味着访问UI。使用
StringBuilder
或带有
string的数组累积字符串。改为加入

千万不要将
double
用作迭代变量;改用
int
(这不是效率问题,而是潜在的问题)

radius*radius
抵消——请注意,
pi
与使用的半径无关,因此您可以假设半径等于1并忽略它

全部内容如下:

StringBuilder sb = new StringBuilder();

for(int sides = 3; sides < 10000; sides++) {
    double pi_est = sides * Math.Sin((2*Math.PI)/sides) / 2;
    sb.append(pi_est + "\n");
}
richTextBox1.AppendText(sb.ToString());
StringBuilder sb=新建StringBuilder();
用于(内部边=3;边<10000;边++){
double pi_est=sides*Math.Sin((2*Math.pi)/sides)/2;
sb.追加(pi_est+“\n”);
}
richTextBox1.AppendText(sb.ToString());

这个
AppendText
调用将花费大量时间,因为它意味着访问UI。使用
StringBuilder
或带有
string的数组累积字符串。改为加入

千万不要将
double
用作迭代变量;改用
int
(这不是效率问题,而是潜在的问题)

radius*radius
抵消——请注意,
pi
与使用的半径无关,因此您可以假设半径等于1并忽略它

全部内容如下:

StringBuilder sb = new StringBuilder();

for(int sides = 3; sides < 10000; sides++) {
    double pi_est = sides * Math.Sin((2*Math.PI)/sides) / 2;
    sb.append(pi_est + "\n");
}
richTextBox1.AppendText(sb.ToString());
StringBuilder sb=新建StringBuilder();
用于(内部边=3;边<10000;边++){
double pi_est=sides*Math.Sin((2*Math.pi)/sides)/2;
sb.追加(pi_est+“\n”);
}
richTextBox1.AppendText(sb.ToString());

编译器应该找出那个。有趣的是,
radius*radius
取消了,所以更好的答案是完全删除它。编译器应该找出那个。有趣的是,
radius*radius
取消了,所以更好的答案是完全删除它。只是想知道,这是为欧拉计划还是什么?数百万(甚至数十亿)位数的圆周率在网上可用,所以你不太可能需要自己估算。@Kinected,不,这只是我自己的练习。只是想知道,这是为欧拉计划还是什么?数百万(甚至数十亿)位数的圆周率在网上可用,所以,你不太可能需要自己估计它。@kineted,不,只是我自己的一个练习。希望我能再投一次赞成票,提醒你圆周率是一样的,不管半径是多少。希望我能再投一次赞成票,提醒你圆周率是一样的,不管半径是多少