VB6中的随机函数

时间:2016-04-13 12:41:23

标签: 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
         Statements
    ElseIf temvar = 2 Then
         Statements
    ElseIf temvar = 3 Then
        Statements
    End If
    cout = cout + 1
Wend  End Sub

但每次我运行它时,它都会显示相同的随机数生成模式。 如何每次生成一组不同的随机数?

我无法理解如何使用Randomizer()

4 个答案:

答案 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