乱数、第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

*1:コンパイル時に指定できるのかどうかは、まだ調べていない