求VB的RND(-n)和Randomize(n)的内部算法
--------------------编程问答-------------------- 以下是一个前辈反汇编的供参考,但Randomize的[eax+4]从哪里来的他自己说没有弄清楚,另外Rnd(-n)他也没做出反汇编-----------------
我电脑上装的是VB6,所以拿MSVBVM60.dll来分析。去掉部分次要的代码后,核心代码如下:
RandomNext:
...
mov ecx,[ebp+8] //将上一次的随机数传入ecx
imul ecx,ecx,2BC03
mov eax,FFC39EC3
sub eax,ecx //此时,eax的值就是产生的下一个随机数了
...
Randomize:
...
mov ecx,[esp+8] //将Randomize后的参数传入ecx
mov edx,ecx
and edx,FFFF
shr ecx,8
shl,edx,8
and ecx,FFFF00
xor edx,ecx
mov ecx,[eax+4] //将旧的种子数传入ecx
and ecx,FF0000FF
or edx, ecx //此时,edx的值就是新的种子数 --------------------编程问答-------------------- 没看明白,楼主你分析出的算法的因变量是哪一个? --------------------编程问答--------------------
我写的不明白吗?
所有的不是我分析的,都是网上现成的。
你说的什么因变量?是Rnd(+n)的算法吗?那就是x = ( x * a + c ) MOD (2^24),我这是VB写法。标准写法应该是y = ( x * a + c ) MOD (2^24),y是第一个随机数;然后y又带入x得到下一个随机数...如此循环不断 --------------------编程问答--------------------
很明显你后一个目的是实现不了的。
[eax+4]很可能和当前时钟计数有关。
补充:VB , 基础类