非重复随机数发生器?

Mar*_*mer 3 random vba generator

我创建了一个使用visual basic for applications(Excel)的琐事游戏,它通过一个案例陈述来选择问题,其中案例是数字.我让程序随机选择一个从1到最大问题数量的数字.使用这种方法,游戏重复问题.

是否有办法制作随机生成数字的东西(每次都有不同的结果)并且不会重复多次?在经历了所有数字之后,它需要执行某个代码.(我会输入结束游戏的代码并显示他们得到的问题数量并且出错了)

我想到了几种不同的方法来做到这一点,但我甚至无法开始考虑语法可能是什么.

小智 7

听起来你需要一个阵列洗牌器!

请查看以下链接 - http://www.cpearson.com/excel/ShuffleArray.aspx

Function ShuffleArray(InArray() As Variant) As Variant()
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' ShuffleArray
' This function returns the values of InArray in random order. The original
' InArray is not modified.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Dim N As Long
    Dim Temp As Variant
    Dim J As Long
    Dim Arr() As Variant


    Randomize
    L = UBound(InArray) - LBound(InArray) + 1
    ReDim Arr(LBound(InArray) To UBound(InArray))
    For N = LBound(InArray) To UBound(InArray)
        Arr(N) = InArray(N)
    Next N
    For N = LBound(InArray) To UBound(InArray)
        J = CLng(((UBound(InArray) - N) * Rnd) + N)
        Temp = InArray(N)
        InArray(N) = InArray(J)
        InArray(J) = Temp
    Next N
    ShuffleArray = Arr
End Function

Sub ShuffleArrayInPlace(InArray() As Variant)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' ShuffleArrayInPlace
' This shuffles InArray to random order, randomized in place.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Dim N As Long
    Dim Temp As Variant
    Dim J As Long

    Randomize
    For N = LBound(InArray) To UBound(InArray)
        J = CLng(((UBound(InArray) - N) * Rnd) + N)
        If N <> J Then
            Temp = InArray(N)
            InArray(N) = InArray(J)
            InArray(J) = Temp
        End If
    Next N
End Sub
Run Code Online (Sandbox Code Playgroud)

  • +1.随机化并在开始时完成所有工作,这样你就可以在随机列表中循环,这很聪明.在每个问题之后保存工作. (2认同)

aev*_*nko 5

这是另一个需要.它会生成一系列独特的随机长片.在这个例子中,我使用1到100.它通过使用集合对象来实现.然后你可以在qArray中对每个数组元素进行正常循环,而不需要多次随机化.

Sub test()
Dim qArray() As Long
ReDim qArray(1 To 100)

qArray() = RandomQuestionArray
'loop through your questions

End Sub

Function RandomQuestionArray()  
Dim i As Long, n As Long
Dim numArray(1 To 100) As Long
Dim numCollection As New Collection

With numCollection
    For i = 1 To 100
        .Add i
    Next
    For i = 1 To 100
        n = Rnd * (.Count - 1) + 1
        numArray(i) = numCollection(n)
        .Remove n
    Next
End With

RandomQuestionArray = numArray()

End Function
Run Code Online (Sandbox Code Playgroud)