生成非重复,无序列号

时间:2010-04-10 08:42:40

标签: objective-c iphone random

如何使用代码执行此操作:

产生15个随机数[编辑:从1 - 15],这些数字不是任何顺序,只发生一次 例如

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

rand()或arc4rand()可以重复一些,这不是我之后的内容。

由于

2 个答案:

答案 0 :(得分:4)

最简单的方法是生成数字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

最后的洗牌是为了确保可能的任何排序都不会影响最终结果。

答案 1 :(得分:2)

生成完整列表,然后将其洗牌。

的Python:

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

随机数生成器本身几乎可以按照您的意愿执行操作。它需要跟踪已经生成的所有数字,这与上面描述的解决方案一样需要内存。