乱数発生アルゴリズムを発明した話 | TheoryOfContraints official blog

乱数発生アルゴリズムを発明した話

http://www.4gamer.net/games/042/G004287/20140905040/

で、昔のゲームの乱数発生アルゴリズム=ルーレット機能をどう作ったかが読める

昔は1バイト=0から255までの数字をどうルーレットでデタラメに取り出すのか?と言うので苦労していたそうだ。と言うか、昔、MSXと言うマイコンでアセンブラでアプリを作ってたりしたので、すごくリアルタイムで、MSX FAN誌のアセンブラ講座とかで読みましたよ…

まぁ、敵キャラの出現場所やタイミングや、じゃんけんでどれを出すかなどを人工知能が決めるのはルーレットで決めるので、すごく大切なアルゴリズムな訳です

で、その昔のゲームの乱数発生アルゴリズムの条件は

・0から255までの数字がまんべんなく出る
・繰り返し同じパターンで数字が出てこない

が理想な訳です。で、HSPで乱数発生ライブラリを作ってみた

-------
; randomlib.as
; program: Hisao Ookubo,

#module 

; 乱数の取得
#defcfunc rnd256 int a
r = rnd256_seed_@(rnd256_count_@)
rnd256_count_@ = rnd256_count_@ + 1
if (rnd256_count_@ >= 256) {
rnd256_count_@ = 0
rnd256shufful
}
r = r \ a
return r

; 変数のシャッフル
#deffunc rnd256shufful
repeat 256
r = rnd(256)
temp = rnd256_seed_@(cnt)
rnd256_seed_@(cnt) = rnd256_seed_@(r)
rnd256_seed_@(r) = temp
loop
return 

#global

; ライブラリの初期化
randomize ; システム乱数の初期化
dim rnd256_seed_, 256 ; 変数の初期化
repeat 256
rnd256_seed_(cnt) = cnt
loop
rnd256_count_ = 0
rnd256shufful ; 変数発生

-------

昔のファミコンやマイコン風に言うと

まず、256バイトのバッファーにそれぞれ0から255までの数字をまんべんなく置く
バッファーをシャッフルする
バッファーから数字を一つずつ取り出し、バッファーが無くなればシャッフルする

すると、昔のゲームの乱数発生アルゴリズムの条件を満たす、マジックと言うか手品程度の凄い乱数発生ルーチンができる

昔のファミコンやマイコンとは違ってメモリが豊富なので、256バイトものメモリを使って富豪な実装ができるのです

って、確か、ファイナルファンタジーの乱数アルゴリズムはデータテーブル使ってたよ… まぁ、ROMでですけれど

まぁ、おバカな発想な乱数発生アルゴリズムですよ。「シャッフル法」とでも呼んでおきます
( ´艸`)

とりあえず、これでファミコン風乱数発生アルゴリズムは確保できたぞ
ヽ(*・ω・)人(・ω・*)ノ

シャッフル時にシステムの乱数を使っているけど、ザイログなアセンブラならRレジスタとか使うのだろうな… まぁ、使えるファミコン風乱数発生ライブラリを作るのが目的なので