私の質問はプログラミング言語よりもアルゴリズムに関連しているので、私を説明するために任意の言語を自由に使用してください。
配列があり、ランダムにシャッフルしたいのですが、とにかくシャッフルには一度に2つの要素を含める必要があります。だから、私が持っている場合:
1 2 3 4 5 6 7 8 9 10
1-2,3-4,5-6
、等。ペアは一緒にシャッフルする必要があり、たとえば、次のようになります
3 4 7 8 9 10 1 2 5 6
「シャッフル配列」を実際の配列の半分のサイズとして表示していることを除いて、通常のシャッフルと同じです。意味1,2,3,4,5,6
は実際には配列になり1 2, 3 4, 5 6
ます。
フィッシャーイェーツを使用した擬似コードは次のとおりです。
To shuffle an array a of n elements (indices 0..n-1) in pairs of 2:
for i from (n − 1) / 2 downto 1 do
j ← random integer with 0 ≤ j ≤ i
exchange a[j * 2] and a[i * 2]
exchange a[j * 2 + 1] and a[i * 2 + 1]
ペアのインデックスを使用して配列を作成します。つまり、入力配列の2倍小さい配列を使用し、その上でstd::random_shuffle
(in C++
)を使用してから、ヘルパー配列に従って元の配列を変更します。