Generate non-repeating, no sequential numbers

后端 未结 2 465
我在风中等你
我在风中等你 2020-12-07 05:58

how does one use code to do this:

produce 15 random numbers [EDIT: from 1 - 15] that are not in any order, and that only occur once eg.

1 4, 2, 5, 3, 6, 8, 7

2条回答
  •  一生所求
    2020-12-07 06:37

    The simplest way is to produce a collection (e.g. an array) of the numbers 1-15, and then shuffle it. (EDIT: By "collection of the numbers 1-15" I mean 1, 2, 3, 4, 5... 15. Not a collection of random numbers in the range 1-15. If I'd meant that, I'd have said so :)

    You haven't given details of which platform you're on so we can't easily give sample code, but I'm a big fan of the modern variant of the Fisher-Yates shuffle. For example, in C#:

    public static void Shuffle(IList 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;
        }
    }
    

    If you want to produce "more random" numbers (e.g. 15 distinct integers within the entire range of integers available to you) then it's probably easiest just to do something like this (again, C# but should be easy to port):

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

    The shuffling at the end is to make sure that any ordering which might come out of the set implementation doesn't affect the final result.

提交回复
热议问题