モンテカルロ法を用いたπの計算 最終更新日 2011年6月18日 10:24 モンテカルロ法とは数値計算を確率により行うアルゴリズム。 総数Nの点をランダムに打ち、その内半径1の円の領域内に入った点の数Mとの比からπを算出する。 この例では簡略化のため、総数nの点のうち、半径が1の円の1/4の扇型に入った点の数をmとし、π=4*m/nとして求める。 C# VB 別ウィンドウで開く すべて選択してコピー ダウンロード 行番号を表示する using System; using System.Diagnostics; class Sample { static void Main() { Console.Write("サンプル数? "); var s = int.Parse(Console.ReadLine()); Console.WriteLine("π = {0}", Math.PI); for (var i = 0; i < 10; i++) { var m = 0; var rand = new Random(); var sw = Stopwatch.StartNew(); for (var n = 0; n < s; n++) { var x = rand.NextDouble(); var y = rand.NextDouble(); if (Math.Sqrt(x * x + y * y) < 1.0) m++; } sw.Stop(); var pi = 4.0 * m / s; Console.WriteLine("{0:D2}回目 ({1:F2}秒): π ≒ {2:F10}", i, sw.Elapsed.TotalSeconds, pi); } } } 別ウィンドウで開く すべて選択してコピー ダウンロード 行番号を表示する Imports System Imports System.Diagnostics Class Sample Public Shared Sub Main() Console.Write("サンプル数? ") Dim s As Integer = Integer.Parse(Console.ReadLine()) Console.WriteLine("π = {0}", Math.PI) For i As Integer = 1 To 10 Dim m As Integer = 0 Dim rand As New Random() Dim sw As Stopwatch = Stopwatch.StartNew() For n As Integer = 1 To s Dim x As Double = rand.NextDouble() DIm y As Double = rand.NextDouble() If Math.Sqrt(x * x + y * y) < 1.0 Then m += 1 Next sw.Stop() Dim pi As Double = 4.0 * m / s Console.WriteLine("{0:D2}回目 ({1:F2}秒): π ≒ {2:F10}", i, sw.Elapsed.TotalSeconds, pi) Next End Sub End Class 出力例 サンプル数? 1000000 π = 3.14159265358979 00回目 (0.08秒): π ≒ 3.1409200000 01回目 (0.08秒): π ≒ 3.1414600000 02回目 (0.08秒): π ≒ 3.1442400000 03回目 (0.08秒): π ≒ 3.1406640000 04回目 (0.07秒): π ≒ 3.1401520000 05回目 (0.08秒): π ≒ 3.1385680000 06回目 (0.08秒): π ≒ 3.1404080000 07回目 (0.07秒): π ≒ 3.1380320000 08回目 (0.07秒): π ≒ 3.1419400000 09回目 (0.07秒): π ≒ 3.1428960000 サンプル数? 100000000 π = 3.14159265358979 00回目 (6.42秒): π ≒ 3.1413966000 01回目 (6.41秒): π ≒ 3.1416413200 02回目 (6.39秒): π ≒ 3.1416714800 03回目 (6.40秒): π ≒ 3.1415544000 04回目 (6.79秒): π ≒ 3.1415177200 05回目 (6.50秒): π ≒ 3.1415052800 06回目 (6.36秒): π ≒ 3.1417421200 07回目 (6.34秒): π ≒ 3.1414884400 08回目 (6.33秒): π ≒ 3.1415430800 09回目 (6.18秒): π ≒ 3.1420759200 サンプル数? 1000000000 π = 3.14159265358979 00回目 (62.45秒): π ≒ 3.1416370760 01回目 (63.28秒): π ≒ 3.1415688320 02回目 (69.53秒): π ≒ 3.1416274120 03回目 (63.40秒): π ≒ 3.1415608600 04回目 (63.52秒): π ≒ 3.1416296080 05回目 (65.45秒): π ≒ 3.1415655560 06回目 (67.72秒): π ≒ 3.1415810680 07回目 (68.42秒): π ≒ 3.1416201240 08回目 (63.22秒): π ≒ 3.1415901560 09回目 (64.61秒): π ≒ 3.1415952080