Different numbers from 1 to 10

前端 未结 5 1068
太阳男子
太阳男子 2020-12-02 00:20

I want to generate 10 different numbers from a range of 0-9. the desired output may look like this, 9 0 8 6 5 3 2 4 1 7

Dim arraynum(9) As Integer
Dim crmd A         


        
相关标签:
5条回答
  • 2020-12-02 00:56
    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
    
    0 讨论(0)
  • 2020-12-02 01:02

    This is the simplest but working code. Also there are no APIs!

    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, "")
    
    0 讨论(0)
  • 2020-12-02 01:06

    Having no performance requirements specified, I would use the below short and simple code:

    Randomize
    With CreateObject("Scripting.Dictionary")
        Do
            .Item(Int(Rnd * 10)) = ""
        Loop Until .Count = 10
        MsgBox Join(.Keys)
    End With
    
    0 讨论(0)
  • 2020-12-02 01:07

    Choosing random values and then throwing away those that you've already used is a bad idea. It makes the run-times longer as the pool of available numbers gets less since you're throwing away more and more.

    What you want is a shuffle list which I would implement with the following code (pseudo-code since it's homework):

    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]
    

    By simply selecting a random number from the pool then replacing it with the top number from that pool and reducing the size of the pool, you get a shuffle without having to worry about a large number of swaps up front. This is important if the number is high in that it doesn't introduce an unnecessary startup delay.

    For example, examine the following bench-check:

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

    You can see the pool reducing as you go and, because you're always replacing the used one with an unused one, you'll never have a repeat.

    And now your homework consists of turning that into VB :-)


    And, since this homework is now almost certainly overdue (about a year ago), I'll post a VBA solution showing how to do it, for completeness.

    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
    

    This generated, on three separate runs:

    :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:
    
    0 讨论(0)
  • 2020-12-02 01:16

    you need a random permutation over an array of 0 to 9.

    I forgot how to write basic.. something like:

    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
    
    0 讨论(0)
提交回复
热议问题