有从1到8,8个数字,需要混乱这8个数字的排列,谁给个节省资源,速度最快的方法。

解决方案 »

  1.   

    Private Sub Command1_Click()
        Dim i As Long, j As Long, k As Long, n As Long
        Dim ss(8) As Long, s As String, s1 As String
        For j = 1 To 8
           ss(j) = j
        Next
        For j = 0 To 200
           Randomize
           i = Int(Rnd * 8) + 1
           s1 = CStr(i)
           k = InStr(s, s1)
           If k = 0 Then
               Debug.Print ss(i)
               n = n + 1
               s = s + CStr(i)
           End If
           If n >= 9 Then Exit For
        Next
    End Sub
      

  2.   

    Private Sub Command1_Click()
    Dim a
    a = Array(1, 2, 3, 4, 5, 6, 7, 8)
    For j = 0 To 7
    a = ch(a)
     Next
     Debug.Print Val(Join(a))
    End SubPrivate Function ch(ByRef a As Variant)
    Dim l1 As Integer
    Dim l2 As Integer
    Dim i As Integer
     Randomize
     i = Int(Rnd * 7) + 1
     l1 = a(0)
     l2 = a(i)
     a(i) = l1
      a(0) = l2
    ch = a
    End Function
      

  3.   

    "貌似会在极特殊的情况下不能列出所有的8个数字,虽然可以增加200为更大的数字来拟补,但仍然可能存在这种情况。"更正我4楼的代码 If n >= 9 Then Exit For 改为 If n >= 8 Then Exit For 这种情况无限小于0,几乎不存在,试了100多次,都没有问题,一般循环8-86次,就完成了
    循环设为200,不是要运行200次,只要够8个数就退出
      

  4.   


    Private Sub Command1_Click()
       Randomize Timer
       Dim a(1 To 8) As Byte, tmp As Byte
       Dim Flg As Boolean, i As Byte, j As Byte
       
       For i = 1 To 8
           Do
             Flg = False
             tmp = Int(Rnd * 8) + 1
             For j = 1 To 8
                 If tmp = a(j) Then
                    Flg = True: Exit For
                 End If
             Next
             
           Loop While Flg
           a(i) = tmp
       Next
       
       '------------以下验证----------------
       For i = 1 To 8
           Debug.Print a(i);
       Next
       Debug.Print
       
    End Sub
      

  5.   


    Private Sub Command1_Click()
       Randomize Timer
       Dim a(1 To 8) As Byte, tmp As Byte
       Dim Flg As Boolean, i As Byte, j As Byte
       
       a(1) = Int(Rnd * 8) + 1
       For i = 2 To 8
           Do
             Flg = False
             tmp = Int(Rnd * 8) + 1
             For j = 1 To 8
                 If tmp = a(j) Then
                    Flg = True: Exit For
                 End If
             Next
           Loop While Flg
           a(i) = tmp
       Next
       
       '------------以下验证----------------
       For i = 1 To 8
           Debug.Print a(i);
       Next
       Debug.Print
       
    End Sub
      

  6.   


    Dim a
        Dim r As Long
        Dim tmp As Long
        Dim i As Long
        
        a = Array(1, 2, 3, 4, 5, 6, 7, 8)
        Randomize
        For i = 0 To UBound(a)
            r = Int(Rnd * (7 - i + 1) + i)
            tmp = a(i)
            a(i) = a(r)
            a(r) = tmp
        Next
        
        Debug.Print Join(a)
      

  7.   

    改一下,最后一个循环可以不要(自己和自己交换了):    Dim a
        Dim r As Long
        Dim tmp As Long
        Dim i As Long
        Dim n As Long
        
        a = Array(1, 2, 3, 4, 5, 6, 7, 8)
        n = UBound(a)
        Randomize
        For i = 0 To n - 1
            r = Int(Rnd * (n - i + 1) + i)
            tmp = a(i)
            a(i) = a(r)
            a(r) = tmp
        Next
        
        Debug.Print Join(a)
      

  8.   


    Private Sub Command1_Click()
       Randomize Timer
       Dim a As String, b As String
       Dim i As Integer, c As String
       
       a = "12345678"
       For i = 8 To 1 Step -1
           c = Mid(a, Int(Rnd * i) + 1, 1)
           b = b & c
           a = Replace(a, c, "")
      Next
      
       '------------以下验证----------------
       Debug.Print b
      
    End Sub
      

  9.   

    如果是string的话,mid语句才快:
    Dim s As String
        Dim r As Long
        Dim tmp As String
        Dim i As Long
        Dim n As Long
        
        s = "12345678"
        n = Len(s)
        Randomize
        For i = 1 To n - 1
            r = Int(Rnd * (n - i + 1) + i)
            tmp = Mid(s, i, 1)
            Mid(s, i, 1) = Mid(s, r, 1)
            Mid(s, r, 1) = tmp
        Next
        
        Debug.Print s
      

  10.   


    #16 king06 想表达什么?
      

  11.   

    从自己的纸牌游戏中拷贝给你Public Function ReShuffleCard(myCard() As Integer) As Boolean
    '将myCard()中的牌重新洗牌ReShuffleCard = False
    On Error GoTo ErrTrapDim ii As Integer, Pos As Integer
    Dim myCardCount As Integer, tempCardCount As Integer
    myCardCount = UBound(myCard)ReDim tempCard(myCardCount) As Integer
    For ii = 0 To myCardCount: tempCard(ii) = myCard(ii): Next iiFor ii = 1 To myCardCount
        Pos = Int(Rnd() * tempCardCount) + 1
        myCard(ii) = tempCard(Pos)
        tempCard(Pos) = tempCard(tempCardCount)
        tempCardCount = tempCardCount - 1
    Next iiReShuffleCard = True
    On Error GoTo 0
    Exit Function
    ErrTrap:
        On Error GoTo 0End Function
      

  12.   

    for i=1 to 8
      s(i) = int(rnd*8+1)
    next
    然后再对这个数组的所有值进行排序,得到的数组下标即为乱序你要的乱序。如果是顺序,也当然乱序的一种,即特殊的乱序。
      

  13.   

    最简单、最快速的方法如下:text1
    command1各一个。代码如下:Private Sub Command1_Click()
        Dim s1 As String, s2 As String
        Dim i As Long
        Dim n As Long
        s1 = "12345678"
        s2 = ""
        For i = 1 To 7
            n = Rnd * 100 Mod Len(s1) + 1
            s2 = s2 & Mid(s1, n, 1)
            s1 = Left(s1, n - 1) & Mid(s1, n + 1)
        Next
        Text1.Text = s2 & s1
    End Sub