■
くろさわ@横浜です。
# fj.comp.misc, fj.sci.math にクロスポストしています。
# Followup-To も同様です。ゲームで使う為の擬似乱数発生関数“クロサワ式乱数”を数年前に
考案して、いくつかのゲームで実際に使いました。
●-32,768〜+32,767(16bit)の整数を発生させる。
●正/負、奇/偶で割とバラけている。
●そこそこ高速。
●16bit の全パターンが発生する。
という物です。最後の点は欠点にも思えますが、
●ゲームでは、数ビットだけをマスクして使う事が多い。
ので、あまり問題にはなりませんでしたし、
●画面を 256x256 のタイリングと見なし、発生した数値の上位下
位バイトをXY座標とすると、65,536 回のループで画面をモレ
なく「じわっ」と消す事が出来る。
という利点もあります。
- - - - - - - - - - - - - - - - - - - - - - - -
◆680x0 版オリジナル
? ? ? ? _KurosawaRandom:
? ? ? ? ; ? ? ? input : A5 ? = work pointer
? ? ? ? ; ? ? ?output : D0.w = random number
? ? ? ? ? ? ? ? move.w ?((lastRnd).w,A5),D0 ? ? ; 直前の値を取り出す
? ? ? ? ? ? ? ? eori.w ?#$9630,D0 ? ? ? ? ? ? ? ; magic #1, 9630 = クロサワ
? ? ? ? ? ? ? ? subi.w ?#$6553,D0 ? ? ? ? ? ? ? ; magic #2
? ? ? ? ? ? ? ? rol.w ? #2,D0 ? ? ? ? ? ? ? ? ? ; magic #3, 左に2ビット回転
? ? ? ? ? ? ? ? move.w ?D0,((lastRnd).w,A5) ? ? ; 結果を書き戻す
? ? ? ? ? ? ? ? rts◆C版
? ? ? ? int ? ? ? ? ? ? KurosawaRandom( void )
? ? ? ? {
? ? ? ? ? ? ? ? static unsigned short lastRnd = 0;? ? ? ? ? ? ? ? lastRnd ^= 0x9630U; ? ? ? ? ? ? ? ? ? ? /* magic #1, 9630 = クロサワ */
? ? ? ? ? ? ? ? lastRnd -= 0x6553U; ? ? ? ? ? ? ? ? ? ? /* magic #2 */
? ? ? ? ? ? ? ? lastRnd = (lastRnd<<2) | (lastRnd>>14); /* magic #3, 左に2ビット回転 */
? ? ? ? ? ? ? ? return (signed short)lastRnd; ? ? ? ? ? /* 符号拡張して返す */
? ? ? ? }