2012-09-19 69 views
1

我正在制作一个程序,通过将具有给定半径的多边形的边数增加到极高的数字,并将该面积除以半径平方来估计pi。我有以下内容:提高C#循环的效率

  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秒钟才能完成。有什么我可以重新写,这将提高我的循环效率?

+0

只是想知道,是这个项目欧拉什么? – Kinected

+1

数以百万计(甚至数十亿)的pi数字可在线获得,因此您不太可能需要自己估算数字。 – nneonneo

+0

@Kinected,Nah,只是我自己的练习。 – Wilson

回答

8

那调用将花费很多时间,因为它意味着访问UI。改为使用StringBuilderString.Join来累加字符串。

您不应该使用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()); 
+1

希望我可以给出另一个upvote提醒pi是相同的无论半径 – Kinected

5

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

此外,如果循环内部不需要更新您的富文本框一次以外的循环,并只使用一个StringBuilder里面。

+0

和'Math.PI/180'。 – Chris

+2

编译器应该弄清楚那一个。 – nneonneo

+0

有趣的是,'radius * radius * * *会取消*,所以更好的答案是完全放弃它。 – nneonneo