如何从数组元素中生成随机序列?

How to make random sequences from array elements?

我制作了一个包含 24 个元素的数组。我想迭代一个循环 24 次,每次都从数组中取出所有元素并制作一个唯一的序列。

例如:

for(int i=0; i<4 ; i++) 
 array = [a,b,c,d]

我想要的输出是:

iteration1: abcd
iteration2: acdb
iteration3: bacd
iteration4: dcab

具体顺序并不重要。重要的是每次迭代的序列必须 唯一

有人可以推荐一种方法吗?也许 C# 中有一些随机化函数?

当您需要单个序列是唯一的时,它不再足以让事物真正 随机。真正的随机性将允许您重复序列。你需要的是 permutations.

我现在没有时间详细介绍所有细节,但 Eric Lippert(以前在 Microsoft C# 语言团队工作)有一系列博客文章,其中一些 很棒 有关在 C# 中进行排列的信息:

https://ericlippert.com/2013/04/15/producing-permutations-part-one/

通读所有部分。在他接触任何代码之前,这是第三部分,但您需要第一部分和第二部分才能理解他在做什么。

这里还值得注意的是,个别排列可能会有些有序。为了得到你真正需要的东西,你可能需要生成 all 排列,shuffle 排列结果集,然后取 前 24 个来自打乱结果的条目。

听起来……很贵。这就是为什么阅读和理解早期文章中发生的事情很重要。如果你能理解它是如何工作的,你可能能够在你进行的过程中在某种程度上随机化你的输出,从而大大提高效率。

这也是正式的计算机科学解决方案。由于你的问题集看起来很小,你也可以做一个更实用的解决方案。将数组克隆 24 次(可能是二维数组),然后循环遍历克隆。对于每个循环迭代,您 shuffle 该克隆,并根据先前的克隆检查它以确保它是唯一的,必要时重复。对于较大的集合,这将是 较慢 ;可能 慢很多 。但以您的尺寸 (24x24),这应该是一场胜利。