如何从数组元素中生成随机序列?
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),这应该是一场胜利。
我制作了一个包含 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),这应该是一场胜利。