0

我的问题与算法有关,而不是编程语言,所以请随意使用任何语言来解释我。

我有一个数组,我想以随机方式对其进行洗牌,无论如何洗牌必须同时涉及 2 个元素。所以,如果我有:

1 2 3 4 5 6 7 8 9 10

1-2,3-4,5-6,ETC。例如,必须将对洗牌在一起,导致以下内容

3 4 7 8 9 10 1 2 5 6
4

2 回答 2

1

它与普通的随机播放相同,除了您将“随机播放数组”视为实际数组大小的一半。含义1,2,3,4,5,6实际上是一个数组1 2, 3 4, 5 6

这是一些使用Fisher yates 的伪代码:

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]
于 2013-02-14T12:08:31.067 回答
0

使用对的索引创建一个数组,即使用一个比输入数组小两倍的数组,在其上使用std::random_shuffle(in C++),然后根据您的辅助数组更改原始数组。

于 2013-02-14T12:09:13.663 回答