2012-04-20 14 views
1

1から6までの整数から長さ3の一意のサブセットを生成しようとしています。私は以下のスクリプトの多くのバージョンで遊んでいましたが、 。もし誰かが私にいくつかの指針を与えることができれば素晴らしいだろう。ありがとう。vbaを使用して長さ3の一意のサブセットを選択

Sub permuteTest() 

num = 6 
cRow = 1 

For i = 1 To num - 2 

    For j = 2 To num - 1 

     For k = 3 To num 

      Cells(cRow, 1).Value = i 
      Cells(cRow, 2).Value = j 
      Cells(cRow, 3).Value = k 

      cRow = cRow + 1 

     Next k 
    Next j 
Next i 

End Sub 

答えて

1

ので、同じように:

Sub permuteTest() 

num = 6 
cRow = 1 

    For i = 1 To num - 2 
     For j = i + 1 To num - 1 
      For k = j + 1 To num 
       Cells(cRow, 1).Value = i 
       Cells(cRow, 2).Value = j 
       Cells(cRow, 3).Value = k 

       cRow = cRow + 1 
      Next k 
     Next j 
    Next i 

End Sub 
1

このルーチンは、解決する方法を示しています。文字列タプル "3,4,1"を生成しますが、必要に応じて配列を使用するように修正することができます。読むのは簡単ではありませんが、すべてのステップを実行すれば明確になります。コンパクトさのために、私は変数を宣言しませんでしたので、Option Explicitなしで実行してください。

Const T = 3 ' generate 3-tuples 
Const N = 6 ' using digits 1,...,6 

Private Sub Permute() 
    Dim cTuples As New Collection: Call cTuples.Add(Empty)  ' start w empty tuple (rank 0) 
    For i = 1 To T: Set cTuples = NewTuples(cTuples, N): Next i ' increase tuple rank T times using N digits 
    For Each vTuple In cTuples: Debug.Print vTuple: Next  ' display the results 
End Sub 

' helper func: turn a set of T-tuples into T+1 tuples 
Private Function NewTuples(Tuples As Collection, N As Integer) As Collection 
    Set NewTuples = New Collection 
    For Each vOldTuple In Tuples 
     For i = 1 To N: NewTuples.Add (AppendToTuple(vOldTuple, i)): Next 
    Next 
End Function 

' helper func: turn a single T tuple into a T+1 tuple 
Private Function AppendToTuple(Tuple, i) 
    If IsEmpty(Tuple) Then AppendToTuple = i Else AppendToTuple = Tuple & "," & i 
End Function 

結果の文字列のタプルがIMMEDウィンドウ(CTRL-G)にdebug.print'ed:

1,1,1 
1,1,2 
1,1,3 
1,1,4 
1,1,5 
1,1,6 
1,2,1 
1,2,2 
... 
6,6,5 
6,6,6 
関連する問題