2012-09-19 116 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