有什么方法可以在 Visual Basic 6.0 中生成从 0 到 &HFFFFFFFF 的随机数?
我正在使用以下功能
Function RandomNumberLong(Lowerbound As Long, Upperbound As Long) As Long
RandomNumberLong = Clng((Upperbound - Lowerbound + 1) * Rnd + Lowerbound)
End Function
如果我使用
x = RandomNumberLong(0,&HFFFFFFFF)
它总是返回 0
这里的问题是 long can hold 的最大值是十进制的 7FFFFFFF 或 2147483647 那么我应该如何解决这个问题呢?即使我使用单一数据类型,它也总是返回没有无符号数字的负数。
根据 MSDN Long 类型
长(长整数)变量存储为带符号的 32 位(4 字节)数字,值范围从 -2,147,483,648 到 2,147,483,647。Long 的类型声明字符是和号 (&)。
但是 FFFFFFFF 的值等于 -1 或 4294967294 溢出。
我想我对此感到困惑。
编辑:
由于这似乎有点复杂,我编写了一个小的 Shell 代码来使用 RDTSC 指令来生成一个随机长数,包括有符号和无符号。
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Option Explicit
Private Sub Form_Load()
Dim x(1 To 10) As Byte, VAL As Long
CopyMemory x(1), &H60, 1 'PUSHAD
CopyMemory x(2), &H310F, 2 'RDTSC EAX holds a random value
CopyMemory x(4), &HA3, 1 'MOV EAX
CopyMemory x(5), VarPtr(VAL), 4 'Pointer of variable // MOV DWORD [VAL],EAX
CopyMemory x(9), &H61, 1 'POPAD
CopyMemory x(10), &HC3, 1 'RET
CallWindowProc VarPtr(x(1)), 0, 0, 0, 0 'Call the shellcode
MsgBox VAL
End Sub