エクセルの質問です。

1
2
3
4
5
と数字があって、これをいわば数字の一筆書きのように、
1→5
2→3
3→4
4→1
5→2

組み合わせを作るアルゴリズムを教えてください。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2007/12/21 02:18:23
  • 終了:2007/12/24 04:03:38

回答(4件)

id:imo758 No.1

imo758回答回数121ベストアンサー獲得回数192007/12/21 01:35:45

ポイント23pt

直接エクセルでのコードを示すわけではありませんが、アルゴリズムをば

1 .. n がちょうど一回ずつ現れる順列 a[1 .. n] を生成して、順列を順番に繋げていきます。

a[1] -> a[2]

a[2] -> a[3]

a[3] -> a[4]

...

a[n-1] -> a[n]

a[n] -> a[1]

a[1 .. n]にランダム順列を用いるなら、例えばこれをどうぞ

http://d.hatena.ne.jp/succeed/20060127

3種類のアルゴリズムが紹介されます

id:clinejp

ありがとうございます。

すみません。アルゴリズムなどとえらそうなことを言ったのですが、実際のVBAにどうしても落とせません。

教えていただけると幸いです。

2007/12/21 03:12:39
id:ku__ra__ge No.2

ku__ra__ge回答回数118ベストアンサー獲得回数402007/12/21 11:51:45

ポイント23pt

質問の例だと、配列にそれぞれの数値を入れ、それをシャッフルさせたものを配列の添え字と対応させてもよいのではないでしょうか。

コードは以下のような感じです。

Const MAX = 5
Dim a(MAX)
'初期化
For i = 1 To MAX: a(i) = i: Next
'シャッフル
For i = 1 To 3 '適当な回数シャッフル
  For arrayIdx = 1 To MAX
    swapIdx = Int(Rnd() * MAX) + 1
    temp = a(arrayIdx)
    a(arrayIdx) = a(swapIdx)
    a(swapIdx) = temp
  Next
Next
'出力
outputStr = ""
For i = 1 To MAX
  outputStr = outputStr & "[" & i & "] → [" & a(i) & "]" & vbCrLf
Next
MsgBox outputStr

http://q.hatena.ne.jp/answer

※urlはダミーです。

id:clinejp

ありがとうございます。

質問の仕方があいまいだったんですが、

1から5に行った人は、5をみましょう。

5に行ったら、つぎは2に行きましょう。

2に行ったら、つぎは

・・・

と、すべての数字を1回だけ通過するようにしたいのです。

2007/12/21 14:19:52
id:SALINGER No.3

SALINGER回答回数3454ベストアンサー獲得回数9692007/12/21 13:20:52

ポイント22pt

VBAで1~5の順列の全ての組み合わせを表示するコードです。

Sub Macro()
    Dim i As Integer
    Dim j1, j2, j3, j4, j5 As Integer
    Dim d(5) As Integer
    Dim c As Integer
    
    c = 1
    
    For j1 = 1 To 5
    For j2 = 1 To 5
    For j3 = 1 To 5
    For j4 = 1 To 5
    For j5 = 1 To 5
        d(1) = j1
        d(2) = j2
        d(3) = j3
        d(4) = j4
        d(5) = j5
        
        If d(1) <> d(2) And d(1) <> d(3) And d(1) <> d(4) And d(1) <> d(5) And d(2) <> d(3) And _
            d(2) <> d(4) And d(2) <> d(5) And d(3) <> d(4) And d(3) <> d(5) And d(4) <> d(5) Then
            For i = 1 To 5
                Cells(i, c).Value = d(i)
            Next i
            c = c + 1
        End If
    Next j5
    Next j4
    Next j3
    Next j2
    Next j1
End Sub

当初、1~n個の順列の組み合わせを作る凡庸的なアルゴリズムを作ろうかと思いましたが、コードが複雑になるのでやめました。

http://q.hatena.ne.jp/

id:imo758 No.4

imo758回答回数121ベストアンサー獲得回数192007/12/21 15:25:14

ポイント22pt

ku__ra__geさんのコードでOKです。

すべての数字を1回だけ通過します。

原理的に、ある数字が重複して現れたり、複数筆書きになったりはしません。

Microsoft Visual Studio 2008 Version 9.0.21022.8 RTM

にて、先頭に

Dim swapIdx, temp As Integer

Dim outputStr As String

という変数宣言を付け加えたコードを走らせて確認しました。

http://google.com/

id:clinejp

ku__ra__geさん失礼しました。

imo758 さんありがとうございます。

ソースを基にしてあれこれ実験できるところまではきました。

また何かあったら質問させてください。

皆様ありがとうございました。

2007/12/24 04:03:17

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

  • VBAのお勉強 simple blog 2007-12-21 07:17:53
    http://q.hatena.ne.jp/1198167363VBAを使うには、Excelから「ツール」→「マクロ」→「Visual Basic Editor」でプロジェクトの中の「Sheet1」をダブルクリックするとコードを記述するウィンドウが表示さ...
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません