【问题标题】:Generate non-repeating, no sequential numbers生成不重复、无序号
【发布时间】:2010-04-10 08:42:40
【问题描述】:

如何使用代码来做到这一点:

产生 15 个随机数 [编辑:从 1 - 15],它们没有任何顺序,并且只出现一次 例如。

1 4、2、5、3、6、8、7、9、10、13、12、15、14、11

rand() 或 arc4rand() 可以重复一些,这不是我所追求的。

谢谢

【问题讨论】:

  • 好的,你用的是什么语言?
  • 您真的想要 1 到 15 之间任意顺序的 15 个数字吗?
  • 我不关心订单本身,更重要的是,每次我通过它,它的不同
  • @Sam Jarman:保证不一样,还是很有可能不一样?

标签: objective-c iphone random


【解决方案1】:

最简单的方法是生成数字 1-15 的集合(例如数组),然后将其随机排列。 (编辑:“数字 1-15 的集合”我的意思是 1、2、3、4、5... 15。不是随机数的集合在 1-15 范围内。如果我是这个意思,我会这么说的:)

您尚未详细说明您使用的是哪个平台,因此我们无法轻易提供示例代码,但我是 Fisher-Yates shuffle 的现代变体的忠实粉丝。例如,在 C# 中:

public static void Shuffle<T>(IList<T> collection, Random rng)
{
    for (int i = collection.Count - 1; i > 0; i--)
    {
        int randomIndex = rng.Next(i + 1);
        T tmp = collection[i];
        collection[i] = collection[randomIndex];
        collection[randomIndex] = tmp;
    }
}

如果您想生成“更随机”的数字(例如,在您可用的整个整数范围内有 15 个不同的整数),那么 可能 最简单的方法就是执行这样的操作(同样,C# 但是应该很容易移植):

HashSet<int> numbers = new HashSet<int>();
while (numbers.Count < 15)
{
    numbers.Add(rng.Next());
}
List<int> list = numbers.ToList();
// Now shuffle as before

最后的改组是为了确保可能从集合实现中出来的任何排序都不会影响最终结果。

【讨论】:

  • @astander:以什么方式?你有一个数字 1-15 的集合,然后你把它洗牌 - 你怎么能得到重复的?我会澄清答案以防你误解,但我认为这很好......
  • 默认生成15个随机数应该是随机的,但我们都知道不是。至少应该进行一些检查以确保它不存在...从 OP q 产生 15 个不按任何顺序排列的随机数,并且只出现一次
  • @astander:我在哪里声称我会生成 15 个随机数?我说的是数字 1-15。那是完全不同的。
  • @astander:请参阅问题正文中的示例,该示例确实使用了数字 1-15。没有具体迹象表明他想要更大范围内的 15 个任意随机数。但是,我已经编辑了我的答案以解释如何做到这一点......
  • 好的,OP 已经编辑了问题产生 15 个随机数 [编辑:从 1 - 15],这使它成为一个不同的球类游戏。
【解决方案2】:

生成完整列表,然后随机播放。

Python:

import random
r = range(1, 16)
random.shuffle(r)

随机数生成器本身几乎按照定义不能做你想做的事。它需要跟踪所有已经生成的数字,这与上面描述的解决方案一样需要大量内存。

【讨论】:

  • 那么也许你应该提到这一点。无论哪种方式,Python 通常都是提供可执行伪代码的好方法。
猜你喜欢
  • 2011-03-28
  • 2020-12-27
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 2012-02-24
  • 1970-01-01
  • 2011-09-25
相关资源
最近更新 更多