人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

エクセルの質問です。
1
2
3
4
5
と数字があって、これをいわば数字の一筆書きのように、
1→5
2→3
3→4
4→1
5→2

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

●質問者: clinejp
●カテゴリ:コンピュータ ゲーム
✍キーワード:アルゴリズム エクセル 一筆書き 数字
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● imo758
●23ポイント

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

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種類のアルゴリズムが紹介されます

◎質問者からの返答

ありがとうございます。

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

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


2 ● ku__ra__ge
●23ポイント

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

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

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はダミーです。

◎質問者からの返答

ありがとうございます。

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

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

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

2に行ったら、つぎは

・・・

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


3 ● SALINGER
●22ポイント

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/


4 ● imo758
●22ポイント

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/

◎質問者からの返答

ku__ra__geさん失礼しました。

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ