查看: 860  |  回复: 0
  VB6 随机函数Rnd 初始化Randomize
楼主
发表于 2023年5月7日 23:59

新建From1(窗体),新建Command1-2(按钮CommandButton),代码:

Private Sub Command1_Click()
    Dim intN As Integer
    Randomize    ' 对随机数生成器做初始化的动作,
    intN = Int(6 * Rnd + 1)    ' 生成 1 到 6 之间(包括6)的随机整数。
    MsgBox intN
End Sub

Private Function f_Rnd(ByVal lngNum1&, ByVal lngNum2&) As Long
    Dim lngMin&, lngMax&
    Dim lngRange&
    
    ' 确保最小值和最大值正确排序
    If lngNum1 > lngNum2 Then
        lngMin = lngNum2
        lngMax = lngNum1
    Else
        lngMin = lngNum1
        lngMax = lngNum2
    End If
    
    ' 计算范围大小(包含边界值)
    lngRange = lngMax - lngMin + 1
    
    ' 生成随机整数
    Randomize
    f_Rnd = Int(lngRange * Rnd) + lngMin
End Function

' 使用示例
Private Sub Command1_Click()
    Dim lngResult&
    
    ' 生成1到6之间的随机数(与原示例等效)
    lngResult = f_Rnd(1, 6)
    Debug.Print "1到6之间的随机数: " & lngResult
    
    ' 生成-3到3之间的随机数(包含负数)
    lngResult = f_Rnd(-3, 3)
    Debug.Print "-3到3之间的随机数: " & lngResult
    
    ' 测试参数顺序颠倒的情况
    lngResult = f_Rnd(10, 5)
    Debug.Print "5到10之间的随机数: " & lngResult
    
    ' 测试参数顺序颠倒的情况
    lngResult = f_Rnd(2147483646#, 2147483647#)
    Debug.Print "2147483646#到2147483647#之间的随机数: " & lngResult
End Sub

公式如下:

Int((upperbound - lowerbound + 1) * Rnd + lowerbound)

这里,upperbound 是随机数范围的上限,而 lowerbound 则是随机数范围的下限。

运行Command2得到:

1到6之间的随机数: 3
-3到3之间的随机数: -1
5到10之间的随机数: 5
2147483646#到2147483647#之间的随机数: 2147483647

f_Rnd = Int(lngRange * Rnd) + lngMin 是否支持long的数据类型?

变量类型匹配:

lngRange 和 lngMin 都声明为 Long 类型(通过 & 标识)

Rnd 函数返回 Single 类型,但乘以 Long 后结果会自动转换为 Variant(可容纳 Long 范围的值)

Int 函数返回 Long 类型的整数结果

最终运算结果与 Long 类型的 lngMin 相加,结果仍为 Long 类型

数据范围适配:

VB6 中 Long 类型的范围是 -2,147,483,648 到 2,147,483,647

只要 lngRange 的计算结果不超过这个范围(即 lngMax - lngMin + 1 在 Long 范围内),整个表达式就能正确返回 Long 类型的值

类型转换安全:

从 Single 到 Long 的转换在这里是安全的,因为 Int 函数会截断小数部分,不会产生四舍五入导致的范围溢出

最终结果会被正确赋给 Long 类型的函数返回值 f_Rnd

因此,这段代码完全符合 Long 类型的使用规范,可以安全处理该类型支持的所有整数范围。

您需要登录后才可以回帖 登录 | 立即注册
【本版规则】请勿发表违反国家法律的内容,否则会被冻结账号和删贴。
用户名: 立即注册
密码:
2020-2025 MaNongKu.com