vs2019,rand()函数

只使用的rand(),没有调用srand()

进入rand()的汇编代码

call 79F0FEA0 ;
调用一个函数,返回一个地址,保存在eax中

mov dword ptr [ebp-4],eax
;将eax的值保存在 栈 ebp - 4 的地方

mov eax,dword ptr [ebp-4]
;这是废话吧

imul ecx,dword ptr [eax+14h],343FDh
;eax + 0x14 这里查看内存,值为1,为什么需要偏移,而不是直接把准确地址传过来, ecx = 0
; ecx = ecx + 1 * 214013

add ecx,269EC3h
; ecx = 214013 + 2531011

mov dword ptr [ebp-8],ecx
;保存ecx 在ebp-8

mov edx,dword ptr [ebp-4]
;edx = 原来eax保存的地址

mov eax,dword ptr [ebp-8]
;eax = ecx

mov dword ptr [edx+14h],eax
;替换原来的值(也就是种子数)

mov eax,dword ptr [ebp-8]
;eax没变 为什么需要重新赋值

shr eax,10h
;eax = eax >> 16

and eax,7FFFh
;eax = eax & 0x7fff

总结:rand()的返回值

start = (start *214013 + 2531011)
ret = (start >> 16) & 0x7FFF

0 ≤ r e t ≤ 0 \leq ret \leq 0ret 0x7FFF
伪随机
调用srand()的原因是 改变 start(start 默认为1), 使得每次启动返回值不同

214013 = 12589 * 17
2531011 = 21269 * 17* 7
这些数字 有什么特殊的吗

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值