Генерация неповторяющихся, без последовательных чисел - PullRequest
0 голосов
/ 10 апреля 2010

как можно использовать код для этого:

производит 15 случайных чисел [РЕДАКТИРОВАТЬ: от 1 до 15], которые расположены не в любом порядке и встречаются только один раз например.

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

rand () или arc4rand () могут повторять некоторые, что не то, что я после.

Спасибо

Ответы [ 2 ]

4 голосов
/ 10 апреля 2010

Самый простой способ - создать коллекцию (например, массив) из чисел 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

Перемешивание в конце состоит в том, чтобы убедиться, что любой порядок, который может выйти из реализации набора, не влияет на конечный результат.

2 голосов
/ 10 апреля 2010

Создайте полный список, затем перемешайте его.

Python:

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

Генератор случайных чисел сам по себе может почти по определению не делать то, что вы хотите. Необходимо будет отслеживать все уже сгенерированные числа, которые будут так же требовательны к памяти, как и решение, набросанное выше.

...