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 の最大値が 7FFFFFFF または 10 進数で 2147483647 であることです。単一のデータ型を使用しても、符号なしの数値なしで常に負を返します。
MSDNのロングタイプによると
long (long integer) 変数は、値が -2,147,483,648 ~ 2,147,483,647 の範囲の符号付き 32 ビット (4 バイト) 数値として格納されます。Long の型宣言文字はアンパサンド (&) です。
しかし、FFFFFFFF の値は -1 または 4294967294 に等しく、オーバーフローします。
私はこれについて混乱していると思います。
編集:
これは少し複雑に思えるので、代わりに 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