English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

Dim A(8), B(6), i, j, k, p, temp As Integer
Public Sub Run()

Do
X = Int(Rnd * 8) + 1

For k = 0 To i - 1
If X = B(k) Then X = 0
Next

Loop While A(X) = 1 Or X = 0

A(X) = 1

B(i) = X

p = p + 1
If p = 9 Then Erase A: p = 0

End Sub
Private Sub Command1_Click()

Randomize

For i = 0 To 5

Run

Next

For i = 0 To 5
For k = i + 1 To 5

If B(i) > B(k) Then
temp = B(i): B(i) = B(k): B(k) = temp
End If

Next
Next

For i = 0 To 5
Print Format(B(i), \"00\") & \" \";
Next

Print

End Sub

原本想設計成亂數排出01 02 03 04 05 06 ~ 03 04 05 06 07 08等28種結果
\"不依照順序出現(重點)\",當28種結果都出現過後重新在出現28種結果(簡單講按28次之內的結果不要重覆)…不知該怎改
因為每次按到第八次以後就會有重覆現象,是不是上面整個程式需要重寫

其中A(x)是要讓01~08出現的次數一樣 (28*6)/8 = 21次

請各位厲害的高手指點一下

----------------
想了兩週不知怎改

2006-03-08 17:14:55 · 3 個解答 · 發問者 阿祥 2 in 電腦與網際網路 程式設計

3 個解答

'不知道跟你要的一不一樣XDDim A() As String, T As IntegerPrivate Sub Command1_Click()If T = 28 Then Erase A: T = 0: Cls '若已到28重新來過Print Run(), T '輸出End SubFunction Run() As StringDim S As String, I As Integer, J As Integer, X As String, Tmp As String, B() As StringDo   Randomize   For I = 0 To 5 '隨機選擇6個數字       Do         X = Format(Int(Rnd * 8 + 1), "00")       Loop Until InStr(S, X) = 0 '此數字若未出現在S則跳出迴圈       S = S & X & " " '將此數字記錄到S   Next   B = Split(Trim(S)) '分割S到B陣列   For I = 0 To 5 '排序       For J = I + 1 To 5           If B(I) > B(J) Then Tmp = B(I): B(I) = B(J): B(J) = Tmp       Next   Next   S = Join(B) '把B陣列轉成字串放到S   For I = 0 To T - 1 '檢查A陣列是否有相同字串,有的話再重新執行隨機選擇6個數字       If A(I) = S Then S = "": Exit For   Next   DoEventsLoop Until S <> ""ReDim Preserve A(T): A(T) = S: Run = S: T = T + 1 '將S記錄到A陣列並輸出End Function

2006-03-09 11:14:24 補充:
嘿嘿,我認識YA的老闆....

2006-03-11 12:06:23 補充:
01~08應該是跑28次吧?你的意思是否要不經排序直接輸出?那把Run = S放在B = Split(Trim(S))上面就可.
基本上我比較贊成Liu-Liu的方式先組合再隨機取樣,效率比較快.

2006-03-11 23:50:12 補充:
>01~08亂數取六數循環21次
那你把
If T = 28 Then Erase A: T = 0: Cls
改成
If T = 21 Then Erase A: T = 0: Cls
就行了,或是改成動態:
Dim A() As String, T As Integer, N As Integer

Private Sub Command1_Click()
N = InputBox("輸入組數")
If T = N Then Erase A: T = 0: Cls
Print Run(), T '輸出
End Sub

2006-03-11 23:52:55 補充:
更正:
N = InputBox("輸入組數")
應放在Form_Load事件中XD

2006-03-08 04:00:18 · answer #1 · answered by W.J.S. 7 · 0 0

感謝兩位高手回答

2006-03-09 23:38:00 補充:
原來用字串的方式比較好處理,我一直呆呆的用Integer的方式來寫。W.J.S兄的寫法比較接近我想要的,因為我只要把Rnd*8改成9並且改一下T的次數就可以變成01~09了,範圍可以隨意設定。
不過想請問一下W.J.S兄,在你的程式中有沒有可能如我原來的程式把01~08用亂數循環一次後清除在繼續產生01~08的亂數直到所有的01~08都跑21次。但是還是取6個數。

例如:
01 02 03 04 05 06

07 08 01 02 03 04




2006-03-11 21:27:20 補充:
其實8*21 =6*28 =168
我只是想比較01~08亂數取六個數循環21次跑出來的結果跟直接隨意取六個亂數有什麼差別。其實結果都一樣順序排列問題…不過範圍擴大到01~50時出現率就有差了吧!

01~08亂數取六數循環21次

01 02 04 06 07 08
03 05
01 04 06 07
02 03 05 08
01 06
02 03 04 05 07 08


21次01~08
28種取六數的結果...

2006-03-11 21:30:15 補充:
補充一下上面的
03 05和01 04 06 07是同一行
02 03 05 08跟01 06是同一行
只是尚未排列過...

2006-03-11 21:51:39 補充:
如果範圍改成01-24
隨意取六數的前4個結果中(6*8)
有可能01會出現0~4次不等

如果01-24循環亂數取六數
則取六數前4個結果中所有數會各出現一次...

2006-03-12 13:57:11 補充:
3Q ^^

2006-03-09 17:16:57 · answer #2 · answered by 阿祥 2 · 0 0

Dim a(28) As String

Private Sub Command1_Click()
 Cls
 Randomize Timer
 For i = 1 To 100 '在此打散有順序的資料
  X1 = Int(Rnd * 28) + 1
  X2 = Int(Rnd * 28) + 1
  tmp = a(X1)
  a(X1) = a(X2)
  a(X2) = tmp
 Next
 For i = 1 To 28
  Print a(i)
 Next
End Sub

Private Sub Form_Load()
 flag = 0
 For i = 8 To 1 Step -1
  For j = i - 1 To 1 Step -1
   flag = flag + 1
   For k = 1 To 8
    If k <> i And k <> j Then a(flag) = a(flag) + Format(k, "00 ")
   Next
  Next
 Next
End Sub

2006-03-09 07:34:39 補充:
to:W.J.S.
這麼快就破二千五百分,本人覺得有點不服氣!

2006-03-08 10:33:43 · answer #3 · answered by 世賢 7 · 0 0

fedest.com, questions and answers