每次运行程序时,我一直在尝试生成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
但每次我运行它时,它都会显示相同的随机数生成模式。 如何每次生成一组不同的随机数?
我无法理解如何使用Randomizer()
答案 0 :(得分:2)
您的代码可以简化(并更正;您的代码只能从0到2)到此:
Dim i As Integer
For i = 0 To 500
Select Case Int(4 * Rnd())
Case 0
Debug.Print "0";
Case 1
Debug.Print "1";
Case 2
Debug.Print "2";
Case 3
Debug.Print "3";
End Select
Next
试一试,看看。 Randomize
语句仅将种子设置为系统计时器,Rnd(1)
等同于Rnd()
。另外,here's关于Rnd函数的文档。
答案 1 :(得分:0)
您可以使用
Randomize Timer
而不是
Randomize
答案 2 :(得分:0)
我无法重现这个问题。您的代码(Statements
替换为Debug.Print
并使用@BobRodes错误修复返回0-3范围内的值)在Excel VBA(与VB6相同的核心语言)中按预期工作,并且在不同的运行中产生不同的数字流。我发掘的Randomize
上的所有文档都是明确的,当没有参数调用时,它使用系统计时器为随机数生成播种。
尽管如此,您的问题和@Marc在评论中链接的博客文章表明,有一个错误会影响VB6处理Randomize
的方式,可能是一个影响某些但不影响其他版本Windows的错误(和/或VB6编译器的版本,如果您使用的是某些旧版本的Visual Studio)。推测,可能包含VB6运行时的DLL在系统计时器的错误位置查找,触发错误,然后错误处理使用0作为传递给Randomize
的种子值。
无论如何,正如@Grcn所说,Randomize Timer
是一种解决方法。但是 - 如果你确实使用了 - 请注意Timer
似乎有毫秒分辨率,如果你按照你的方式使用它,有时候Timer
有可能返回完全相同的值。在一个极端的情况下,如果循环的主体是那种每秒可以执行一百万次的东西,而你就像在你的例子中那样使用一个运行500次的循环,Timer
可能会返回相同的值全部500次。你很快就会注意到,但是如果执行循环所花费的时间刚好低于1毫秒的分辨率,那么你将拥有大于预期的遍历循环的次数,你可以获得相同的“随机”值,但是以一种逃避随意通知的方式。因此,调用Randomize Timer
应该从循环内部移动到它之前。
答案 3 :(得分:0)
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