Different numbers from 1 to 10

前端 未结 5 1083
太阳男子
太阳男子 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 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:
    

提交回复
热议问题