この前作った肉じゃがが美味しかったなあと感じるこんな今朝ですがおはようございます。まがりかどです。
そんなことはめちゃくちゃどうでもよくてですね、今回はScratchで円周率を求めてやろうじゃないかということで頑張ります。
あと、円周率が求まる様子も可視化していきます。
ここで、
っていう人は多分このタイトルを見てこのページに来ている時点で少ないとは思うのでその説明はしません。
円周率を求める前に
ちょっと私のお気に入りのScratchがあるのでちょっと見てください。
https://scratch.mit.edu/projects/318395291/
これ私がふざけて作った猫ふんじゃったなんですけど、開いたら緑の旗を押してみてください。
これ音楽付きなのでぜひ音を最大にしてもらって。
この猫ふんじゃったはゲームとかじゃなくただの動画みたいなものなんですけど、ちゃんとやれば入力を受け取ってゲームも作ることができます。
我ながらこれは人生の最高傑作だと思っています。
これ以上のものを私は作ることができません。
そんなことも置いておいて、円周率を求めていきましょう。
円周率の求め方
円周率はモンテカルロ法というもので近似値を求めるんですが、その具体的な手法については別の記事で解説しているのでそちらを読んでください。
これの前半部分に書いてあります。
後半はPythonでの実装例なので読まなくて大丈夫です。
これ作ったマサチューセッツ公開大学の人もまさか円周率を求めるやつが出てくるなんて思ってなかったでしょうね。
このScratchっていうやつブロック組み合わせるだけでできて子供向けなのは確かなんですけど関数とか配列とかが再現できるようになっていていい感じです。
Let’s Scratch
ここからは上の記事を読むかどうにかしてモンテカルロ法の知識はあるものとして解説していきます。
スプライトの設定
まずスプライトを設定していきます。
プロジェクトの新規作成を押すと最初に愉快な猫がスプライトにいると思うのでそれのコスチュームを開いてください。
そして
そしてそのスプライトのコスチュームを開いてコスチューム2を消してください。
さらに猫全体を矢印のやつで選択してゴミ箱のところをクリックして削除しましょう。
すると、あの愉快な猫はいなくなりからのコスチューム1になりました。
拡張機能ペンの追加
ブロックを組み合わせるぞ

コードはこんな感じです。
見にくいかもしれませんので、https://scratch.mit.edu/projects/475684919/editor/
どうぞこちらから見てください。
ブロック定義を使っているのはいったん見ないことにしてください。
後で説明します。
ということで上から解説していきます。

まず前実行して描画されたものを「全部消す」で消します。
ペンは上げるか下げると下げるで書くことができて、ペンを下げたままスプライトの座標を動かしたら線を引くことができ、座標を動かすたびにペンを上げ下げすると点をいっぱい打つことができます。
で、「点の数」という変数は円の中に入った点の数を表しています。
また、「今の回数」はループする回数のカウンタという感じです。
ループするたびに1ずつ増やしていきます。
こちらが「試行回数」という値を与えられるように後でするので「今の回数」= 「試行回数」になるまでループを繰り返すという感じにします。

そしてx座標、y座標それぞれ-100から100までの間で乱数を取り、スプライトをそこに移動します。
そして三平方の定理で原点(0, 0)からの距離の二乗を求めます。

で、求めた「距離の二乗」が\(100^2\)以下かどうかつまり10000以下かどうかを判定します。
距離の二乗のルートを取ると距離がでてくるのに何で二条のままなのと思うかもしれませんが、ルートの計算は時間がかかるし小数も出てくるので避けたほうがいいです。
あと不等式の記号が<=がなくて<しかなかったので<10001で判定しています。
よく考えたら「距離の二乗」は小数もあり得るのでこれだとちょっと判定が甘めになってしまいますがまあちょっとくらいいいでしょう。
で、点が円の中に入っていたら「点の数」を1増やしてそこに黄緑色で点を打ちます。
入っていなかったらピンクで点を打ちます。
試行回数の設定
試行回数をこちらから与えられるように「試行回数」のチェックボックスにチェックをつけて実行画面上に表示してそれを右クリックでスライダーにしておきましょう。
スライダーの値の範囲は0から1000000くらいにしておいたらいいと思います。
再描画を設定
ここで、一度実行してみてください。
ちょっと遅いと思いません。
100000回とかにしたら結構時間かかると思います。
ここで、上で一回スルーしてもらったブロックの登場です。
私がブロックでやってたので、おそらく同じようにブロックを定義してやってくれたことでしょう。
ですが、ただのブロックではだめなのです。
ブロック定義のブロックを作るをクリックしてみてください。
そうするとブロックの名前を決めるところになると思いますが、左下に再描画をオフにするという文言がありますね。
そう、これです。
これは描画するたびにそれを実行画面に反映させるかどうか決めるやつです。
チェックをつけると反映させなくなりめちゃくちゃはやくなります。
やってみてください。
完成したので円周率を見てみましょう

こんな感じになりました。円もきれいにかけてるし円周率も結構近いですね。
いいかんじです。
ありがとうございました。
Scrathってなんなんだよ?