Random VB6中的随机化函数
每次运行程序时,我都会多次尝试生成0-3之间的随机数。 我现在使用的代码如下: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
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
而这正是我要找的汉克斯,这正是我要找的