【问题标题】:How to make random sequences from array elements? [closed]如何从数组元素中生成随机序列? [关闭]
【发布时间】:2018-04-12 18:31:38
【问题描述】:

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

例如:

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

我想要的输出是:

迭代1:abcd 迭代2:acdb 迭代3:bacd 迭代4:dcab

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

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

【问题讨论】:

  • 你试过什么?什么不起作用?
  • 请向我们展示您到目前为止所做的尝试。
  • 代码!给我们代码!
  • 基本上你想要随机排列。 Eric Lippert 写了一篇关于如何产生排列的博客,然后你可以自己添加随机性ericlippert.com/2013/04/15/producing-permutations-part-one
  • 这不是问题被关闭的副本。 似乎只是随机化一个序列,但当你仔细观察时,它实际上是关于排列,这是一个不同的问题。那里可能已经有一个很好的骗子了,但是如果我们要关闭这个,我们需要找到一个可以使用的。

标签: c# arrays sequences


【解决方案1】:

当您需要单个序列是唯一的时,仅仅随机 就已经不够了。真正的随机性将允许您重复序列。相反,您需要的是排列。

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

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

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

这里还值得注意的是,各个排列可能会有些有序。要获得您真正需要的内容,您可能需要生成 all 排列,shuffle 排列结果集,然后取 前 24 洗牌结果中的条目。

听起来……很贵。这就是为什么阅读和理解早期文章中发生的事情很重要的原因。如果你能理解它的工作原理,你也许可以在一定程度上随机化你的输出,从而大大提高效率。

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

【讨论】:

猜你喜欢
  • 2016-04-27
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
相关资源
最近更新 更多