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

时间:2018-04-12 18:31:39

标签: c# arrays sequences

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

例如:

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

我想要的输出是:

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

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

有人可以推荐一种方法吗?也许在C#中有一些随机化的功能?

1 个答案:

答案 0 :(得分:1)

当你需要单独的序列是独一无二的时候,对于真正随机的东西来说已经不够了。真正的随机性将允许您重复序列。您需要的是排列。

我现在没有时间了解所有细节,但Eric Lippert(以前在微软的C#语言团队中)有一系列博客文章,其中包含一些伟大的信息C#中的排列:

  

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

阅读所有部分。在获得任何代码之前,这是第三部分,但是你需要第一部分和第二部分才能理解他正在做什么。

此处值得注意的是,个别排列可能会有些有序。要获得您真正需要的内容,您可能需要生成所有排列, shuffle 排列结果集,然后先使用 24 洗牌结果中的条目。

这听起来很贵。这就是为什么阅读和理解早期文章中发生的事情很重要的原因。如果您能理解它是如何工作的,那么您可以随意将输出随机化,从而极大地提高效率。

这也是正式的计算机科学解决方案。由于您的问题集的大小似乎很小,您也可以做一个更实际的解决方案。将数组克隆24次(可能是2D数组),然后遍历克隆。对于每个循环迭代,您shuffle进行克隆,并根据先前的克隆进行检查,以确保它是唯一的,并根据需要重复。对于较大的集合,这将较慢;可能很多更慢。但按照你的规模(24x24),这应该是一场胜利。