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
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
"貌似会在极特殊的情况下不能列出所有的8个数字,虽然可以增加200为更大的数字来拟补,但仍然可能存在这种情况。"更正我4楼的代码 If n >= 9 Then Exit For 改为 If n >= 8 Then Exit For 这种情况无限小于0,几乎不存在,试了100多次,都没有问题,一般循环8-86次,就完成了 循环设为200,不是要运行200次,只要够8个数就退出
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
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
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)
改一下,最后一个循环可以不要(自己和自己交换了): 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)
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
如果是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
#16 king06 想表达什么?
从自己的纸牌游戏中拷贝给你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
for i=1 to 8 s(i) = int(rnd*8+1) next 然后再对这个数组的所有值进行排序,得到的数组下标即为乱序你要的乱序。如果是顺序,也当然乱序的一种,即特殊的乱序。
最简单、最快速的方法如下: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
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
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
循环设为200,不是要运行200次,只要够8个数就退出
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
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
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)
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)
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
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
#16 king06 想表达什么?
'将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
s(i) = int(rnd*8+1)
next
然后再对这个数组的所有值进行排序,得到的数组下标即为乱序你要的乱序。如果是顺序,也当然乱序的一种,即特殊的乱序。
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