トルネコの大冒険2 (PS) > 確率

乱数

32-bit 疑似乱数生成器を用いており、その状態 x(格納アドレス 0x800ca418)は次の式で更新されます: x ← (x × 0x5d588b65 + 1) mod 2^{32}

乱数 0〜(n-1) は (x / 2^{16}) mod n によって生成されます。

参考: GBA 版の乱数生成処理も同一です。

ソース

+ ...
;
; state の更新
;
80089DF0 3C045D58 mov     r4,5D580000h
80089DF4 3C03800D mov     r3,800D0000h
80089DF8 8C62A418 mov     r2,[r3-5BE8h]
80089DFC 34848B65 or      r4,8B65h
80089E00 00440018 smul    r2,r4
80089E04 00002812 mov     r5,lo
80089E08 24A20001 add     r2,r5,1h
80089E0C AC62A418 mov     [r3-5BE8h],r2 ; r2 ← (r2 * 0x5d588b65 + 1) & 0xffffffff
80089E10 03E00008 ret
80089E14 00021402 + shr   r2,10h
 
;
; 乱数 0〜(r4-1) を返す
;
80089E18 27BDFFE8 push    r16,ra,wasted
80089E24 0C02277C call    80089DF0h
80089E28 00808021 + mov   r16,r4
80089E2C 16000003 jnz     r16,80089E3Ch
80089E34 0802279A jmp     80089E68h
80089E38 00001021 + mov   r2,0
 
80089E3C 0050001A sdiv    r2,r16
80089E40 16000002 jnz     r16,80089E4Ch
80089E48 0007000D break   1C00h
 
80089E4C 2401FFFF mov     r1,-1h
80089E50 16010004 jne     r16,r1,80089E64h
80089E54 3C018000 + mov   r1,80000000h
 
80089E58 14410002 jne     r2,r1,80089E64h
80089E60 0006000D break   1800h
 
80089E64 00001010 mov     r2,hi
80089E68 8FBF0014 mov     ra,[sp+14h]
80089E6C 8FB00010 mov     r16,[sp+10h]
80089E70 03E00008 ret
80089E74 27BD0018 + add   sp,18h
 
最終更新:2024年06月09日 12:06