while True:

問題8

以下のヒントに従って,モンテカルロ法を使って円周率を求めるプログラムを作れ.生成す る点の数を入力とする. [ヒント]0 から 1 までの 2 つの乱数 𝑥,y から点 (𝑥, 𝑦) を生成する.この操作を 𝑛 回繰り 返して,生成した点が原点から距離1以内の点であった場合の数を 𝑚 とする.このとき4𝑚⁄𝑛 は円周率の近似値となる.これはモンテカルロ法により 1 辺の長さが 1 の正方形と半径 1 の 四分円の面積比を求めていることに相当する.様々な 𝑛 に対して求まった円周率の誤差につ いて調査してみるとよい. 具体的に乱数には組み込みサブルーチン RANDOM_NUMBER などを利 用するとよい.

難易度 ★★☆☆☆

基本的な問題です。解法が分かれば実装は簡単です。提示された条件どおりに実装できれば終わりです。 IF、DO2つを使いましょう。 サブルーチン RANDOM_NUMBER の使い方は、call RANDOM_NUMBER(obj)でOK。
program question8
	implicit none
	integer :: n, m, i
	real :: x, y

	print *, "input n:"
	read *, n

	m = 0
	
	do i = 1, n
		call RANDOM_NUMBER(x)
		call RANDOM_NUMBER(y)
		if ( ((x ** 2 + y ** 2) ** (0.5)) <= 1 ) then
			m = m + 1
		end if
	end do

	print *, 4.0 * m / n

end program question8
ページのトップへ戻る