2013-11-29 9 views
-3

Я хочу сгенерировать 9 случайных чисел, но я не хочу генерировать один и тот же номер дважды. Есть простой способ сделать это?Как сгенерировать 9 уникальных случайных чисел

Я хочу создать числа между 0 и 10, чтобы получить числа 1,2,3,4,5,6,7,8,9. Я собираюсь поместить эти числа в массив, и код не будет работать, если я получу тот же номер дважды, и все они должны быть случайными, разными номерами каждый раз, когда вы запускаете программу.

+0

У вас есть выбор? Какова минимально приемлемая ценность? Или максимальный? –

+0

Я предполагаю использовать временную метку для такого рода сухих –

+3

Что так сложно проверить ранее сгенерированные числа, которые вы ищете «простым способом»? –

ответ

1

Просто продолжайте генерировать новые номера и сравнить их с ранее сгенерированных из них

1

Используйте shuffle bag.

Я считаю это более чистым решением, чем проверка ваших старых чисел, которые теоретически могут быть замкнуты навсегда.

+0

Ссылка неплохая статья. Я не могу подчеркнуть, насколько плохое решение «продолжает генерировать и искать столкновение», это интервью «nohire» прямо там. –

+0

Чтобы исправить эту проблему, я сам придумал алгоритм перетасовки, но позже узнаю, что он уже изобрел и назвал Shuffle Fisher-Yates. – Carra

0
using System; 
using System.Linq; 

namespace Test { 
    class Program { 
    static void Main(string[] args) { 
     var random = new Random(); 
     int[] sequence = new int[9]; 
     do { 
     for (var i = 0; i < sequence.Length; i++) { 
      sequence[i] = random.Next(); 
     } 
     } while (sequence.Distinct().Count() != sequence.Length); 
    } 
    } 
} 
1

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

псевдокод:

  • В то время как у меня меньше, чем N элементов
    • Сформировать элемент
    • Если это дубликат, выбросьте его

Если диапазон мал , а количество необходимых вам элементов - значительная часть (например, 9 номеров из 1-10), которые вы можете предпочесть для использования shuffle bag.

Псевдокод:

  • Перечислять весь диапазон
  • Перемешайте перечисление в случайном порядке
  • Возьмем первые N товар
1

Фишера-Йейтс Перемешать является еще одним хорошим решением:

Random _random = new Random(); 

public static void Shuffle<T>(T[] array) 
{ 
    var random = _random; 
    for (int i = array.Length; i > 1; i--) 
    { 
     // Pick random element to swap. 
     int j = random.Next(i); // 0 <= j <= i-1 
     // Swap. 
     T tmp = array[j]; 
     array[j] = array[i - 1]; 
     array[i - 1] = tmp; 
    } 
} 

И называть это так:

int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
Shuffle(array); 

Этот метод перемешивает исходный массив на месте, но он может легко модифицирована таким образом, что он возвращает другой объект. Никакое сравнение «предыдущих значений» не требуется. В вашем случае он просто выполняет 8 раз.

0
int[] numbers = (
    from number in Enumerable.Range(0, 10) 
    orderby Guid.NewGuid() 
    select number) 
    .ToArray(); 
0
Random r = new Random(); 
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
List<int> result = new List<int>(); 
while (numbers.Count() > 0) 
{ 
    int pos = r.Next(0, numbers.Count() - 1); 
    result.Add(numbers[pos]); 
    numbers.RemoveAt(pos); 
} 
0

Используйте цикл на 10 номеров и использования, INT R = arc4random()% чисел; где число - это диапазон, в котором число будет генерировать, хранить и использовать эти числа. Надеюсь, это поможет вам лучше понять ваши потребности.

0

Это создает 6 случайных Интс между 0 и 10 (эксклюзивный):

int[] numbers = Enumerable.Range(0, 10) 
       .OrderBy(i => Guid.NewGuid()) 
       .Take(6) 
       .ToArray(); 
Смежные вопросы