close
1.前言:
在C#中產生亂數,用蒙地卡羅模擬方法求圓周率。
2.說明:
蒙地卡羅模擬是利用統計理論來處理數值分析問題,有關蒙地卡羅方法,可參考wiki的說明
http://en.wikipedia.org/wiki/Monte_Carlo_method
本範例是利用系統產生亂數,亂數產生的(x,y)點繪製在影像上,當點在圓內,標記為紅色,當點在圓外,標記為綠色。若圓面積與正方形面積的比例為A,可得到圓周率為4*A,因此可計算亂數點落在圓內與所有點的比例來估算近似圓周率。
程式碼:
private void MonteCarloSimulation() { //定義影像檔 Image img = new Bitmap(500, 500); //在image上繪圖 Graphics g = Graphics.FromImage(img); //繪圖品質設定 g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; g.CompositingQuality = CompositingQuality.HighQuality; g.SmoothingMode = SmoothingMode.AntiAlias; g.InterpolationMode = InterpolationMode.High; //先將背景色設定為黑色 g.FillRectangle(new SolidBrush(Color.FromArgb(30, 30, 30)), 0, 0, 500, 500); Random rnd = new Random(); int cntInside = 0; int cntTotal = 100000; for (int i = 0; i < cntTotal; i++) { int posX = rnd.Next(0, 500); int posY = rnd.Next(0, 500); if ((Math.Pow((double)posX, 2) + Math.Pow((double)posY, 2)) <= Math.Pow(500, 2))//落在圓內 { cntInside++; SolidBrush s = new SolidBrush(Color.FromArgb(255, 0, 0)); RectangleF rec = new RectangleF(posX, posY, 1, 1); g.FillRectangle(s, rec); } else//落在圓外 { SolidBrush s = new SolidBrush(Color.FromArgb(0, 255, 0)); RectangleF rec = new RectangleF(posX, posY, 1, 1); g.FillRectangle(s, rec); } } //AreaRatio = pi*r^2/(2r)^2 = pi/4 ==> pi=4*AreaRatio Console.WriteLine("Simulation PI Value: {0}", (4.0 * (double)cntInside / (double)cntTotal).ToString()); //顯示影像 pictureBox1.Image = img; }
繪圖:
文章標籤
全站熱搜