标题: 英杰传:用GB4改变随机数的原理, 感谢孝直的算法解说
性别:未知-离线 likelove

Rank: 2Rank: 2
组别 百姓
级别 破贼校尉
功绩 1
帖子 57
编号 56074
注册 2005-12-27


发表于 2011-12-15 21:24 资料 短消息 看全部作者
随机数在计算时,种子是更新回去的。理论上玩家只能通过保留变化,影响后续的随机数计算序列。
这是随机数计算的过程,RandA,RandB保留上次计算结果,每次计算都要更新:

seg001:3DA0 _sub_Rand00     proc far                ; CODE XREF: _sub_RandAX+7P
seg001:3DA0                 push    41C6h
seg001:3DA3                 push    4E6Dh
seg001:3DA6                 push    ds:_word_RandB
seg001:3DAA                 push    ds:_word_RandA
seg001:3DAE                 call    __aFlmul
seg001:3DB3                 add     ax, 3039h
seg001:3DB6                 adc     dx, 0
seg001:3DB9                 mov     ds:_word_RandA, ax
seg001:3DBC                 mov     ds:_word_RandB, dx
seg001:3DC0                 mov     ax, dx
seg001:3DC2                 and     ah, 7Fh
seg001:3DC5                 retf
seg001:3DC5 _sub_Rand00     endp



顶部
性别:未知-离线 likelove

Rank: 2Rank: 2
组别 百姓
级别 破贼校尉
功绩 1
帖子 57
编号 56074
注册 2005-12-27


发表于 2011-12-28 08:52 资料 短消息 看全部作者


QUOTE:
原帖由 阿尔法孝直 于 2011-12-16 19:08 发表
_word_RandA和_word_RandB其实是由一个dword数拆成的两个word数(因为这是16位汇编),且
_word_RandB是高字,_word_RandA是低字。

16位汇编的伪随机数算法
sub_20D00 proc far
push    41C6h
push    4 ...

想起来freecell随机数的一个小BUG,因为它是调用系统DLL中那段代码,就是你所说的32位那段,其中有And和SHR操作,导致随机数不会超过0xFFFF,所以后面直到1000000的牌局只能手动选。


顶部

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




当前时区 GMT+8, 现在时间是 2025-7-24 12:49
京ICP备2023018092号 轩辕春秋 2003-2023 www.xycq.org.cn

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

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