Shuffling一个数组是通过多次交换数组内的元素来完成的。
如果您获取一个数组,则交换元素,然后再次交换它们,但是按照最初交换它们的相反顺序,您将得到原始数组。
这些改组位置可以从PRNG (Pseudorandom number generator) 生成。对于给定的seed,PNRG 将始终生成相同的数字:这将是您的“关键”。
这是一些使用该想法的代码(Fisher Yates 用于随机播放):
public static void Shuffle(ArrayList list, int seed, bool reverse = false)
{
Random rng = new Random(seed);
List<Tuple<int, int>> swaps = new List<Tuple<int, int>>();
int n = list.Count;
//prepare swapping positions
while (n > 1) {
n--;
int k = rng.Next(n + 1);
swaps.Add(new Tuple<int, int>(k, n));
}
//reverse if needed
if(reverse)
swaps.Reverse();
//swap the items
foreach(Tuple<int, int> swap in swaps)
{
object value = list[swap.Item1];
list[swap.Item1] = list[swap.Item2];
list[swap.Item2] = value;
}
}
用法:
ArrayList a = new ArrayList();
int key = 2742;
Shuffle(a, key);
Shuffle(a, key, true);
请注意,如果您不希望键是整数,而是字符串,则可以使用完全相同的方法,但整数使用 "somekey".GetHashCode()