当前位置:编程学习 > VB >>

求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的值就是新的种子数 --------------------编程问答-------------------- 没看明白,楼主你分析出的算法的因变量是哪一个? --------------------编程问答--------------------
引用 2 楼 bcrun 的回复:
没看明白,楼主你分析出的算法的因变量是哪一个?

我写的不明白吗?
所有的不是我分析的,都是网上现成的。
你说的什么因变量?是Rnd(+n)的算法吗?那就是x = ( x * a + c ) MOD (2^24),我这是VB写法。标准写法应该是y = ( x * a + c ) MOD (2^24),y是第一个随机数;然后y又带入x得到下一个随机数...如此循环不断 --------------------编程问答--------------------
引用 楼主 oGanTongShenShou 的回复:
我的目的是给我一个rnd(-n)和randmomize(n)就能算出来和VB一样的结果。

MSDN:
Randomize 语句

注意 若想得到重复的随机数序列,在使用具有数值参数的 Randomize 之前直接调用具有负参数值的 Rnd。使用具有同样 number 值的 Randomize 是不会得到重复的随机数序列的。 

很明显你后一个目的是实现不了的。
[eax+4]很可能和当前时钟计数有关。
补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,