不同的数字从1到10

时间:2009-12-07 08:28:45

标签: vb6

我想从0到9的范围内生成10个不同的数字。所需的输出可能如下所示,9 0 8 6 5 3 2 4 1 7

Dim arraynum(9) As Integer
Dim crmd As Boolean
Dim rmd as integer

For i = 0 To 9
    arraynum(i) = -1
Next i

crmd = True
Randomize Timer
For i = 0 To 9
    rmd = Int(Rnd * 10)
    For j = 0 To 9
        If arraynum(j) = rmd Then
            j = 9
            If crmd = False Then
                i = i - 1
            End If
            crmd = True
        Else
            crmd = False
        End If
    Next j
    If crmd = False Then
        arraynum(i) = rmd
        QuestionILabel.Caption = QuestionILabel.Caption + Str(arraynum(i))
    End If
Next i

5 个答案:

答案 0 :(得分:12)

选择随机值然后丢弃那些你已经使用过的错误的想法。随着越来越多的可用数字池越来越少,它会使运行时间变长。

你想要的是一个随机列表,我将使用以下代码实现(伪代码,因为它的功课):

dim n[10]                 // gives n[0] through n[9]
for each i in 0..9:
    n[i] = i              // initialize them to their indexes
nsize = 10                // starting pool size
do 10 times:
    i = rnd(nsize)        // give a number between 0 and nsize-1
    print n[i]
    nsize = nsize - 1     // these two lines effectively remove the used number
    n[i] = n[nsize]

只需从池中选择一个随机数,然后将其替换为该池中的顶部数字并减小池的大小,就可以获得一个随机播放,而无需担心前面的大量交换。如果数量很高,这很重要,因为它不会引入不必要的启动延迟。

例如,检查以下基准检查:

<--------- n[x] ---------->
for x = 0 1 2 3 4 5 6 7 8 9  nsize  rnd(nsize)  output
---------------------------  -----  ----------  ------
        0 1 2 3 4 5 6 7 8 9     10           4       4
        0 1 2 3 9 5 6 7 8        9           7       7
        0 1 2 3 9 5 6 8          8           2       2
        0 1 8 3 9 5 6            7           6       6
        0 1 8 3 9 5              6           0       0
        5 1 8 3 9                5           2       8
        5 1 9 3                  4           1       1
        5 3 9                    3           0       5
        9 3                      2           1       3
        9                        1           0       9

你可以看到游泳池减少了,因为你总是用未使用过的游泳池替换旧游泳池,你将永远不会重复。

现在你的作业包括把它变成VB: - )


而且,既然这个作业现在几乎肯定已经过期了(大约一年前),我会发布一个VBA解决方案,展示如何做到这一点,为了完整性。

Option Explicit
Option Base 0
Sub Macro1()
    Randomize
    Dim list(10) As Integer
    Dim i As Integer
    Dim size As Integer
    Dim pos As Integer
    Dim result As String

    For i = 0 To 9
        list(i) = i
    Next

    size = 10
    result = ":"
    For i = 1 To 10
        pos = Int(Rnd() * size)
        result = result & list(pos) & ":"
        size = size - 1
        list(pos) = list(size)
    Next

    MsgBox result
End Sub

这是在三次单独的运行中生成的:

:5:7:4:2:9:1:0:8:3:6:
:3:9:6:0:7:8:5:4:2:1:
:7:6:3:5:1:8:9:0:4:2:

答案 1 :(得分:1)

你需要在0到9的数组上进行随机排列。

我忘记了如何写基本的东西......比如:

dim a(10)
for i=0 to 9 do a(i) = i
rem do random permute over a:
for i=0 to 9 do 
  j = rand() mod (i+1)
  tmp = a(j)
  a(i) = a(j)
  a(j) = tmp
next i

答案 2 :(得分:0)

没有指定性能要求,我将使用以下简短代码:

Randomize
With CreateObject("Scripting.Dictionary")
    Do
        .Item(Int(Rnd * 10)) = ""
    Loop Until .Count = 10
    MsgBox Join(.Keys)
End With

答案 3 :(得分:-1)

Option Explicit 'Force variable declaration

Private Sub Form_Load()
    Dim Ar(1 To 100) As Integer 'The array to store it in
    Dim i, j As Integer 'Counters for loops
    Dim X As Integer 'Variable to store the random generated number
    Dim bFound As Boolean 'Boolean to check if the value has been generated before

    Randomize 'Just once to ensure that we get random values

    For i = 1 To 100
        Do 'Start the loop that generates a random number and checks if it has already been generated
            X = RandomInteger(1, 100) 'Generate a random number
            bFound = False 'Set the boolean to false, if we find the number while searching the array, we'll set it to true which means that we already have that number
            For j = 1 To i 'We only need to check up to i (since we haven't put any values in the rest of the array)
                If Ar(j) = X Then 'If an item of the arrray is the same as the last generated number
                    bFound = True 'Set the boolean to true (it already exists)
                    DoEvents 'To not freeze until the looping is done
                    Exit For 'Since we found it there is no need to check the rest
                End If
            Next
        Loop Until bFound = False 'If it wasn't found then we'll add it, if it was found then we go back to generating a new number and comparing it with all the items of the array
        Ar(i) = X 'Add it to the array
    Next

    ShowInTextBox Text1, Ar 'Just to print the data and see it
End Sub

Private Function RandomInteger(Lowerbound As Integer, Upperbound As Integer) As Integer 'The random number generator code
    RandomInteger = Int((Upperbound - Lowerbound + 1) * Rnd + Lowerbound)
End Function

Private Sub ShowInTextBox(TB As TextBox, A() As Integer) 'Just a sub to show the data in a textbox
    Dim i As Integer

    TB.Text = ""

    For i = 1 To UBound(A)
        TB.Text = TB.Text & CStr(A(i)) & vbCrLf
    Next

    TB.Text = Left$(TB.Text, Len(TB.Text) - 2)
End Sub

答案 4 :(得分:-1)

这是最简单但有效的代码。也没有API!

Dim a(1 To 10), tmp, count, isRepeated
count = 1
Randomize
While count <= 10
    isRepeated = False
    tmp = Left(Rnd * 10, 1)
    For i = 1 To 10
        If tmp = a(i) Then isRepeated = True: Exit For
    Next
    If isRepeated = False Then a(count) = tmp: count = count + 1
Wend
YourLine = Join(a, "")

这就是所有人!!