标题: 英杰传:用GB4改变随机数的原理, 感谢孝直的算法解说
性别:男-离线 阿尔法孝直
(雀力日进)

闽国公
遂安军节度使
★★★★★★

Rank: 19Rank: 19Rank: 19Rank: 19
柱国(正二品) 轩辕春秋年度最佳(游戏人生区)
组别 节度使
级别 卫将军
好贴 2
功绩 1796
帖子 6037
编号 19070
注册 2004-10-16
家族 轩辕雀党


发表于 2011-12-13 23:46 资料 个人空间 短消息 看全部作者 QQ
随机数算法,适用于英杰传系列的所有游戏:

设A为32位(即4字节,范围0~4294967295)随机种子,计算

B=1103515245 * A+12345

此时B应该是一个64位(即8字节)整数,取B的低32位填回A作为下一次随机数运算的种子,即

A=B MOD 4294967296

最后的随机数是:

RANDOM=(新的A/65536) MOD 32768

如果需要0~N-1之间的随机整数,那就计算 RANDOM MOD N


顶部
性别:男-离线 阿尔法孝直
(雀力日进)

闽国公
遂安军节度使
★★★★★★

Rank: 19Rank: 19Rank: 19Rank: 19
柱国(正二品) 轩辕春秋年度最佳(游戏人生区)
组别 节度使
级别 卫将军
好贴 2
功绩 1796
帖子 6037
编号 19070
注册 2004-10-16
家族 轩辕雀党


发表于 2011-12-14 00:13 资料 个人空间 短消息 看全部作者 QQ
回复 #5 edmund_liyc 的帖子

这个还真不知道。。找不到单挑部分的代码。


顶部
性别:男-离线 阿尔法孝直
(雀力日进)

闽国公
遂安军节度使
★★★★★★

Rank: 19Rank: 19Rank: 19Rank: 19
柱国(正二品) 轩辕春秋年度最佳(游戏人生区)
组别 节度使
级别 卫将军
好贴 2
功绩 1796
帖子 6037
编号 19070
注册 2004-10-16
家族 轩辕雀党


发表于 2011-12-16 19:08 资料 个人空间 短消息 看全部作者 QQ
_word_RandA和_word_RandB其实是由一个dword数拆成的两个word数(因为这是16位汇编),且
_word_RandB是高字,_word_RandA是低字。

16位汇编的伪随机数算法


sub_20D00 proc far
push    41C6h
push    4E6Dh
push    word_40F72      ; word_RandomH
push    word_40F70      ; word_RandomL
call    __aFlmul
add     ax, 3039h
adc     dx, 0
mov     word_40F70, ax
mov     word_40F72, dx  ; dx:ax=dword_Random
mov     ax, dx
and     ah, 7Fh
retf
sub_20D00 endp


和32位汇编的伪随机数算法


sub_4472FC proc near
mov     eax, dword_453B20
imul    eax, 41C64E6Dh
add     eax, 3039h
mov     dword_453B20, eax
and     eax, 7FFF0000h
shr     eax, 10h
retn
sub_4472FC endp


应该是等效的。

[ 本帖最后由 阿尔法孝直 于 2011-12-16 19:16 编辑 ]
顶部

正在浏览此帖的会员 - 共 1 人在线




当前时区 GMT+8, 现在时间是 2025-5-9 22:27
京ICP备2023018092号 轩辕春秋 2003-2023 www.xycq.org.cn

Powered by Discuz! 5.0.0 2001-2006 Comsenz Inc.
Processed in 0.009069 second(s), 9 queries , Gzip enabled

清除 Cookies - 联系我们 - 轩辕春秋 - Archiver - WAP