効率がよくて正確な乱数発生プログラムをいろいろ試してみた!
チーム名:紀北工業高校昆布
森田汐音くん、楠本翼くん(和歌山県立紀北工業高校 2年)
(2021年3月取材)
モンテカルロ法を利用した乱数の研究
部活動の一環でプログラムを組む機会が多くあり、そんな中でプログラムの作りによって処理の効率に差があることに気づきました。また、乱数を使って円周率を出すアルゴリズムを学んだことをきっかけとして、今回、『モンテカルロ法を利用した乱数の研究』について調べることにしました。
モンテカル法を使って円周率を出す方法は、乱数で座標を発生させて三平方の定理を使い座標が円の中にあれば数えます。そしてそれに4をかけて発生させた数で割ると円周率が出てきます。
今回この研究では内部関数を利用したもの2種類と、数学の関数などを利用した自作の乱数のアルゴリズム4種類で調べました。
数学の関数の勉強をしていて「この数字はきっとデタラメな数字に違いない。」と思ったものも、今回の研究でその数について調べた結果、本当の乱数に較べてそんなにデタラメでないことがわかりました。
※クリックすると拡大します。
■今回発表した研究を始めた理由や経緯を教えてください。
乱数を使って円の形をシミュレーションすることで、円周率を求めるアルゴリズムを学びました。実際にプログラムを作ってみると、あまりいい円周率の値が出ないので、乱数をいろいろ試してみることでその値がどうなるかという興味から、今回の研究に取り組みました。
■今回の研究にかかった時間はどのくらいですか。
研究にかけた時間は、1日3時間を10日間です。部活動(コンピュータ部)での練習時間で取り組みました。
■今回の研究ではどんなことに苦労しましたか。
プログラミングは、部活動で慣れていたので大丈夫でしたが、乱数の発生方法を考えるアイデア自体の部分で苦労しました。
■「ココは工夫した!」「ココを見てほしい」という点を教えてください。
乱数の精度を上げるためにいろいろな工夫をしました。
プログラムの実行時間を、約2日(48時間)程度の大量のデータ数を用いてみたり、小数部分の取り出す桁数を変えてみたりして、結果を見ながら試行錯誤してみました。
また、変数の範囲を超えるデータを代入すると、普通はオーバーフローでエラー扱いなのですが、そのときのデータがほぼ乱数に見えたのでそれを利用するなど、思いつくいろいろなアイデアを利用してみました。
■今後「こんなものを作ってみたい!」「こんな研究をしてみたい」と思うことを教えてください。
今回は、変数がオーバーフローしたときの値や関数の値の小数部分など、一見でたらめと見える値から試してみましたが、全然良い値の円周率が得られず、自分たちでいろいろ工夫してみました。
結果的には良い値を得ることができませんでしたが、自分たちでアイデアを出して考えてみることは大変楽しく、良い経験ができたと思いました。
部活動では、アルゴリズム自体の練習する機会が多くできるならば、そのアルゴリズム自体を工夫するようなテーマに取り組んでみたいと思います。
第83回情報処理学会全国大会中高生情報学研究コンテスト ポスター発表より
※紀北工業高校昆布チームの発表は、奨励賞を受賞しました。