セルに変更のないセルがないという制約を受けて、Aの列のセルをランダム化またはシャッフルする必要があります。値インデックスを繰り返さずに値のセットをランダム化する
私はこのコードで列Cに候補のランダム化を置いています:
Sub ShuffleCutandDeal()
Dim A As Range, C As Range
Dim B As Range, cell As Range
Set A = Range("A1:A24")
Set B = Range("B1:B24")
Set C = Range("C1")
A.Copy C
Randomize
For Each cell In B
cell.Value = Rnd()
Next cell
With ActiveSheet.Sort
.SortFields.Clear
.SortFields.Add Key:=Range("B1:B24") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange Range("B1:C24")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
ランダム化作品が、時には私のような何かを得る:私は、そのデータを参照する場合
をアイテムが移動されていない場合は、すべてのアイテムが移動されるまでコードを再実行します。
私はこの"最初に成功しなかったら.........のアプローチは本当にダムです。
ランダム化してすべてのアイテムが1回のパスで移動したことを確認する良い方法はありますか?
EDIT#1:iliketocodeさんのコメントに基づいて、私はにthis postでトニーのアプローチを適応させるためにVBAしようとし
:
私はアイデアがある推測する:
スワップC1とC2とC24の間のランダムな選択
C3とC24の間のランダムな選択でC2をスワップすると、
C4とC24の間のランダムな選択でC3をスワップすると、
................
C23とC24の間のランダムな選択でC22をスワップし、最後に
スワップC23とC24を入れ替えます。
これを1000回実行し、不要な一致が表示されないようにしました。
ランダム化を繰り返すか、潜在的な重複を除いたサブセットからのみランダム化する必要があります。後者を生み出す努力とは対照的に前者が起こる可能性を考えると、前者がより良い選択と思われる。 3つまたは4つの値のようなものがあれば、後者がより適切かもしれません。 – Jeeped
残りの23のランダムに選択されたものと複製を交換することができます。これにより、複製を作成せずに複製を削除します。あなたは、重複して1度だけ行う必要があります - たぶんプールを減らして毎回選ぶようにしましょう。 – OldUgly
問題を再読した後、この問題を再開しています。 a)それは直接の複製ではなく、b)それ自体で立つことは十分に面白いです。 – Jeeped