モンテカルロ法とは数値計算を確率により行うアルゴリズム。 総数Nの点をランダムに打ち、その内半径1の円の領域内に入った点の数Mとの比からπを算出する。 この例では簡略化のため、総数nの点のうち、半径が1の円の1/4の扇型に入った点の数をmとし、π=4*m/nとして求める。
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