Random VB6中的随机化函数

Random VB6中的随机化函数,random,vb6,Random,Vb6,每次运行程序时,我都会多次尝试生成0-3之间的随机数。 我现在使用的代码如下: Private Sub scatterfun() Dim cout As Integer, temvar As Integer While (cout < 500) Randomize temvar = CInt(Int((3 * Rnd(1)) + 0)) If temvr = 0 Then Statements ElseIf temvar = 1 Then

每次运行程序时,我都会多次尝试生成0-3之间的随机数。 我现在使用的代码如下:

Private Sub scatterfun()
Dim cout As Integer, temvar As Integer
While (cout < 500)
    Randomize
    temvar = CInt(Int((3 * Rnd(1)) + 0))
    If temvr = 0 Then
        Statements
    ElseIf temvar = 1 Then
         Statements
    ElseIf temvar = 2 Then
         Statements
    ElseIf temvar = 3 Then
        Statements
    End If
    cout = cout + 1
Wend  End Sub
Private Sub scatterfun()
Dim cout为整数,temvar为整数
而(cout<500)
随机化
temvar=CInt(Int((3*Rnd(1))+0))
如果temvr=0,则
声明
ElseIf temvar=1,则
声明
ElseIf temvar=2,则
声明
ElseIf temvar=3,则
声明
如果结束
cout=cout+1
温端接头
但每次我运行它,它都会显示相同的随机数生成模式。 如何每次生成一组不同的随机数


我不知道如何使用Randomizer()

您的代码可以简化(并更正;您的代码只给出0到2的值):


试试看。
Randomize
语句仅将种子设置为系统计时器,
Rnd(1)
相当于
Rnd()
。此外,Rnd函数上的文档。

您的代码可以简化(并更正;您的代码只给出0到2的值):

试试看。
Randomize
语句仅将种子设置为系统计时器,
Rnd(1)
相当于
Rnd()
。此外,Rnd功能上的文档。

您可以使用

Randomize Timer
而不是

Randomize
你可以用

Randomize Timer
而不是

Randomize

我无法重现这个问题。您的代码(使用
语句
替换为
调试.打印
并使用@BobRodes bug fix返回0-3范围内的值)在Excel VBA(与VB6相同的核心语言)中按预期工作,并在不同的运行中生成不同的数字流。我发现的所有关于Randomize的文档都清楚地表明,在没有参数的情况下调用时,它使用系统计时器来种子生成随机数

尽管如此,您的问题和@Marc在评论中链接到的博客文章表明,存在一个影响VB6如何处理
随机
,可能是一个影响某些但不影响其他版本的Windows(和/或VB6编译器的版本,如果您使用的是较旧版本的Visual Studio)。推测一下,可能包含VB6运行时的DLL在系统计时器的错误位置查找,触发错误,然后错误处理使用0作为传递给
Randomize
的种子值


在任何情况下,@Grcn指出,
随机化计时器
都是一种解决方法。但是——如果您确实使用了它——请注意,
Timer
似乎具有毫秒分辨率,如果您像现在这样在循环中使用它,则
Timer
有时可能会返回完全相同的值。在极端情况下,如果循环体是每秒可以执行一百万次的类型,并且您正在使用一个运行500次的循环,
Timer
可能会返回所有500次相同的值。您很快就会注意到这一点,但如果执行循环所需的时间刚好低于1毫秒的分辨率,则在具有相同“随机”值的循环中,您将有超过预期的通过次数,但这种方式不会引起偶然注意。因此,应将调用
随机化计时器
从循环内部移动到它之前。

我无法重现该问题。您的代码(使用
语句
替换为
调试.打印
并使用@BobRodes bug fix返回0-3范围内的值)在Excel VBA(与VB6相同的核心语言)中按预期工作,并在不同的运行中生成不同的数字流。我发现的所有关于Randomize的文档都清楚地表明,在没有参数的情况下调用时,它使用系统计时器来种子生成随机数

public Function PrintRandom (MaxShow as byte)
i=0
    While i<=MaxShow '
      Randomize 'initial random number. if not use ,number will show same value
      form.print Int(Rnd(20)*10) 
      ' Rnd(20) output 0.75 
      ' *10 to get value 7.5 
      ' Int() function to get integer value 7
      i=i+1
    Wend
End Sub 

Private Sub Form_Activate()
    PrintRandom (4) 'will show 4 number in form
End Sub
尽管如此,您的问题和@Marc在评论中链接到的博客文章表明,存在一个影响VB6如何处理
随机
,可能是一个影响某些但不影响其他版本的Windows(和/或VB6编译器的版本,如果您使用的是较旧版本的Visual Studio)。推测一下,可能包含VB6运行时的DLL在系统计时器的错误位置查找,触发错误,然后错误处理使用0作为传递给
Randomize
的种子值

在任何情况下,@Grcn指出,
随机化计时器
都是一种解决方法。但是——如果您确实使用了它——请注意,
Timer
似乎具有毫秒分辨率,如果您像现在这样在循环中使用它,则
Timer
有时可能会返回完全相同的值。在极端情况下,如果循环体是每秒可以执行一百万次的类型,并且您正在使用一个运行500次的循环,
Timer
可能会返回所有500次相同的值。您很快就会注意到这一点,但如果执行循环所需的时间刚好低于1毫秒的分辨率,则在具有相同“随机”值的循环中,您将有超过预期的通过次数,但这种方式不会引起偶然注意。因此,应将调用
随机定时器
从循环内部移动到其前面。

公共函数PrintRandom(MaxShow作为字节)
public Function PrintRandom (MaxShow as byte)
i=0
    While i<=MaxShow '
      Randomize 'initial random number. if not use ,number will show same value
      form.print Int(Rnd(20)*10) 
      ' Rnd(20) output 0.75 
      ' *10 to get value 7.5 
      ' Int() function to get integer value 7
      i=i+1
    Wend
End Sub 

Private Sub Form_Activate()
    PrintRandom (4) 'will show 4 number in form
End Sub
i=0 而i
公共函数PrintRandom(MaxShow作为字节)
i=0

而这正是我要找的汉克斯,这正是我要找的