プログラムを勉強しようとしてつまづいた話 〜その3〜

料理の作り方と融合させるときが来た



π の値を統計的に求める - コンピュータらしい解き方


数学の歴史上、円周率 π を求めるのに数多くの方法が試され、さいわいにも現代では 

tan (π/4) = 1 このようなわかりやすい表記で表せます

しかし、コンピュータの登場によってかつては除外されていた方法も可能になりました

上記の赤い正方形の中にランダムで点を打ち、それが円の中にあるかどうかを判定し何回も繰り返すことで統計として円周率の値を求められる この方法がコンピュータなしには実現困難なのは同じ作業を何百、何千、何百万回と高速に繰り返さなければならず、人間が同様の作業をすれば結果を得るのに何日何年もかかってしまう

これを料理の作り方のようなプログラムにしてみよう

  1. 0から1の間の数値を乱数によりふたつ作る
  2. できた数字をxとyに入れる
  3. 点 x,y が円の中にあるか判定する
  4. 今回の作業の結果を書き込む
  5. 結果を表示する

これをコンピュータが実行できるような言語で書き換えたのがコンピュータ・プログラムです 例えば python という流行の言語に翻訳すると

import random import math a = 0 x = 0 y = 0 for i in range(1000000): x = random.random() y = random.random() d = math.sqrt(x**2+y**2) if d < 1: a += 1 print( 4 * a )

このようになります


順番に一つずつ翻訳してみよう

でたらめな数値を作るには

random.random() を使う、これは 0 から1の間にある 0と1を含まない小数をデタラメに生成する道具です この作り方にぴったりであえて訂正する必要もないのでそのまま xとy という箱にしまいます

x = random.random()

y = random.random()

これで、半分完成です 残りの半分は、random.random()という道具がどこにあるのか事前に教えておかなければなりません

import random

乱数を発生する道具箱を準備してくださいという命令です

これらが合わせてはじめてコンピュータは乱数を作って2つの箱に入れておくことができます

次に、打った点が円の中にあるかどうかを判定する作業に移ります

ここはピタゴラスの定理を使いましょう 直角三角形における長辺の2乗は他の2辺の2乗の和に等しい d² = x² + y² をpython流に書き直すと

d = math.sqrt(x**2+y**2)

となります ただし、√ は数学用の道具箱がないと実行できないので、最初にありかを書いておきましょう

import math

これで d が1より小さければ、点が円の中にあることになります

if d < 1:

a = a + 1

d が1より小さい場合に集計表 a に1を足します

これで、一回の結果をまとめることができました

次ははこれを百万回繰り返してみましょう


同じ仕事を繰り返すには for という命令を使います

for i in range (1000000):

昔の命令だと i の初期値と終了値を指定する感じですが、現代的なプログラムではもっと途中で臨機応変に繰り返す回数を制御できるように、たくさんの繰り返し条件が用意されているようです

次に繰り返す内容を右に一段ずらして書くことで段落をまとめて繰り返すように指定できます

終わったら結果を表示しましょう

print( 4 * a )

この a の値は実際の円の1/4しか反映していないので、4倍した結果を表示します

百万回も繰り返せば、かなり円周率に近い値になりました 回数を増やせば、かなり近づくそうです

次回は、コンピュータと人間の性格の違いについて説明できたらと思います

Comments

Popular posts from this blog