乱数、第2回
http://d.hatena.ne.jp/setsuma/20030813#p1
前回に挙げた乱数の考察。乱数の能力については必要以上の能力だが、GBAのハードウェア事情に適するかを考える。
- 乱数に使用するメモリサイズ
およそ2.5KBのメモリを使用する。最近の計算機環境では問題ないのだが、メモリ量が制限されるGBAでは。32KBしか内部メモリがないのでつらい。
- 初期化フェーズの計算量
1300回ほど累乗の計算が入ってくるので、速いとは言えないとおもう。
が、多重ループでもなく、定数回なので、時間はほぼ一定。
- 乱数生成時の計算量
- テーブルを次のステップに移行させる時の計算量
650ちょっとの累乗いっぱい。むむ。
-
- 生成アルゴリズム
650回に1回だけテーブルを更新する。
生成時は、累乗は4回しか使っていない。
と、ソースを追いながら計算量を考えると次のようなことが言えそうだ。
- 2.5KBのメモリを使うのだが、低速な外部メモリならいけるかもしれない。*1
- 初期化、テーブル更新は、最低でも2万ステップは必要。FPS60だと、1フレームごとにテーブル更新していたらCPUを2/27だけ常に使うことになる。画面描画、音楽演奏、メインの計算、などがあるため、これだけ使うのはつらい。
FPS30だとその半分になるのだが、4%を使われるのはもったいないような気もする。
結論:使ってみて遅ければ取り替えればよい。石を熱くさせるようなゲームだったら多分使えないが。
次回予告(本気半分嘘半分
http://j-gbadev.hp.infoseek.co.jp/bbs_log/log101-164.htm
にあるってGoogleが言ってるから、それとMTの比較。
特に、乱数周期あたりを調べよう?
めもめも:乱数の種は、前回終了時の乱数を保存しておいて、初期化フェーズで保存した乱数を使って乱数の初期化をする、と。
めもめもめも:http://www4.big.or.jp/~macgyver/gbadev/
めめもめもめもめ:「rand()/(RAND_MAX/n + 1)」とhttp://www.vram128k.com/~jozaki/diary/old/0209.html