ロビのランダムを検証する
2016年9月20日
ロビのプログラムのランダム処理で使われるいるランダム値の発生について検証してみました。
ロビのマイコンはランダム値を発生する機能がありロビのプログラムではそれを使っています。
マイコンのアドレス0x0084(32ピット)の値を取得する事でランダム値が得られます。
0〜99の範囲のランダム値を100個のを取得するロビのプログラムを作成しました。
またこのデータを解析するパソコン上で動くプログラムを作成しました。
一番左は横軸が発生番号、縦軸が取得したランダム値を表しています。
次は発生順に2つランダム値をペアにしてそれぞれ横軸と横軸にプロットしたものです。
次の棒グラフは得られたランダム値の個数を示しています。
2以上は同じランダム値が重複して得られた事を0はこの値のランダム値が得られなかった事を示しています。
得られたランダム値によってモンテカルロ法で円周率の近似値を計算してみました。
今回の取得したランダム値からは「3.21」という値が得られました。
別のロビプログラムを作成して2000個のランダム値を発生させて取得したランダム値の個数をカウントしました。
個数のバラツキは11〜30個でした。
参考として同じ内容をWINDOWSのrand関数を使って行ってみました。
モンテカルロ法円周率の近似値計算は「3.06」でした。
この個数のバラツキは9〜32個でした。
続いてマイコンのランダム値を使わずロビのプログラムでランダム値を計算してみました。
ロビのプログラムではあまり複雑なアルゴリズムのプログラムは作成できないので線形合同法というアルゴリズムを使っています。
x = x * a + b この計算式使ってランダム値を求めます。
x の初期値としては現在システム時間を表す値(アドレス0x0080)をセットしています。
また a の値は 48828125 b の値は 1 で行いました。
モンテカルロ法円周率の近似値計算は「3.02」でした。
この個数のバラツキは10〜33個でした。
3つのランダム値の取得方法についてを調べてみましたがロビのマイコンボードから取得する方法が一番バラつきもなくいいような気がします。
ランダムに関する事象なので何回かやってみないと判断はできませんがロビのランダム生成はゲームなどを行うには実用的な範囲だと言えると思います。
ロビのプログラムにジャンケンをするものがありますがこのプログラムでやっているランダム処理により取得値にバラツキがないか調べてみました。
0(グー),1(チョキ),2(パー)の3つのランダム値を1000個発生させてその個数をカウントするプグラムを作成しました。
結果は0(グー)が361(36.1%),1(チョキ)が341(34.1%),2(パー)が298(29.8%)でした。
参考のため今回作成したプログラムをアップしておきました。
興味のある方は以下のURLよりダウンロードして実際に試してみてください。
robi_random.zip
ロビのプログラムのランダム処理については以下の資料を参考にしてください。
robi_random.pdf
目次に戻る