micro:bit 円周率を計算してみる
この記事で説明すること
この記事では micro:bit を使って円周率を計算してみる、に挑戦したいと思います。アルゴリズムが重要になるプログラムです。プログラムを書ければこんなことも出来るんだ、ということから、プログラムの奥深さ、面白さをこの記事を読んで頂いている方に知って頂きたいと思います。
アルゴリズムを考える
まず、プログラムで円周率を計算すると言われても中々その方法を考えることは難しいと思います。この記事では micro:bit に用意されているランダムな数値を出力するパーツを使って円周率を求めます。まず、以下のような半径1の円と長さが1の正方形をイメージして下さい。

まず、この正方形の中からある1点をランダムに決めます。x軸の座標 a をランダムに決め、y軸の座標 b をランダムに決めたこの1点(以下の図参照)が半径1の円の内側に存在するかどうかを考えていきます。

まず、上記の点 (a,b) が半径1の円の内側にいるかどうかの判定は点(a,b)の中心からの距離で調べれば良いので root( a^2 + b^2) が計算が可能です。

さて、点(a,b)が半径1の円の内側となる確率はどうなるかというと、面積の比になりますよね。辺の長さ1の正方形の面積は1、円の方は、半径1の円の面積の1/4なので、1*1*pi/4ですね。この比率は以下となります。
正方形の面積 : 円の面積 = 1 : pi / 4
ここで必要な情報は出揃いましたが、これをどのようにプログラムをしていくかわかりましたか?たった1回だけ点(a,b)を決めることに意味はありません、これを100回、1000回と繰り返していくのです。例えば x 回これを繰り返した時に点(a,b)が半径1以内に入る確率は、ある点が半径1以内に入った回数をyとすると、以下になります。
x : y = 1 : pi / 4
ここから pi を左辺に持ってくると以下になります。
pi = 4y / x
つまり、
① ランダムに点(a,b) を決定し、それが半径1の円の内側にあるかどうかを判定する
② 半径1回の内側に点(a,b)があった回数y を数える
③ 上記①②を x回繰り返す
④ pi = 4y / x の式で円周率を計算する
この方法で円周率を近似することが出来るのです。
プログラムしましょう
まず必要な変数を用意して、x 回処理を繰り返すようにパーツを配置します。

0 – 1のランダムな値については「計算」のパーツリストから以下のように作成します。

ここから点(a,b)の中心からの距離 length を求めるまでがこちらになります。平方根も「計算」のパーツリストから持ってくることが出来ます。

length が1以下であるかどうかの行います。

最後に、先ほど求めた計算式に入れて、数値をLEDに表示します。

プログラムが完成しましたので、実際に micro:bit にプログラムをダウンロードし、動作を確認してみてください。3.14…にかなり近い値が表示されるはずです。ランダムな値を使用しておりますので稀に少し離れた値を表示してしまうかもしれませんが、その場合は試行回数のxを増やしてみてください。理論上はこの x を大きくすることで高い精度の円周率が得られるはずです。
最後に
このプログラムでは micro:bit で円周率の計算を行いました。普通にプログラムを書く環境が整っている人には簡単な内容だったかもしれません。皆さんには、micro:bitのようなコンピュータがあれば、ランダムな値から円周率を求めることが出来る、そんな不思議を体験して頂きたかったのです。
これをきっかけに皆さんがプログラムにハマって頂ければ幸いです。何か不明点がありましたらお気軽にお問合せ下さい。
ディスカッション
コメント一覧
はじめまして。
還暦を数年前に通り過ぎてしまったオヤジです。
ボケ予防にと micro:bit を購入してブロック形式でプログラミングを勉強しております。
micro:bit を検索キーワードにして、あちこち参考にさせて頂いております。
こちらの WEB ページは他のところとはかなり違い、とてもよい教科書として使用させて頂いております。
円周率の計算のところで、x の回数が 300,000 回程度ループさせないと 3.14 という値が安定して出ないのにはビックリしました。
最近は micro:bit の記事が少ないようで残念です。
貴重な情報提供して頂き、ありがとうございます。
今後もよろしくお願い致します。
尾崎様
丁寧にコメント頂き有難うございます。
最近は新しい記事も投稿できていない状況ではありますが、また何か面白いネタがありましたらこちらで記事にさせて頂きたいと考えております。
今後とも宜しくお願い致します。