Генератор случайных чисел без дубликатов

В основном я создаю программу для случайного генерации 6 уникальных номеров лотереи, поэтому в одной строке нет дубликатов, вот код, который у меня есть до сих пор …

//Generate 6 random numbers using the randomiser object int randomNumber1 = random.Next(1, 49); int randomNumber2 = random.Next(1, 49); int randomNumber3 = random.Next(1, 49); int randomNumber4 = random.Next(1, 49); int randomNumber5 = random.Next(1, 49); int randomNumber6 = random.Next(1, 49); textBox1.Text = randomNumber1.ToString(); textBox2.Text = randomNumber2.ToString(); textBox3.Text = randomNumber3.ToString(); textBox4.Text = randomNumber4.ToString(); textBox5.Text = randomNumber5.ToString(); textBox6.Text = randomNumber6.ToString(); } 

Я получаю случайные числа, но иногда есть одинаковое число в одной строке, как я могу сделать каждый номер уникальным?

заранее спасибо

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

Вместо этого я бы создал последовательность между 1 и 49 , перетасовывал их и выбирал 6 номеров из последовательности, например:

 var rnd = new Random(); var randomNumbers = Enumerable.Range(1,49).OrderBy(x => rnd.Next()).Take(6).ToList(); 

Вы не можете. Вы только указали, что каждое число будет случайным числом от 1 до 49, а не тем, что оно не должно совпадать с дубликатами.

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

 HashSet numbers = new HashSet(); while (numbers.Count < 6) { numbers.Add(random.Next(1, 49)); } 

Здесь вы воспользуетесь устранением дубликатов HashSet. Это не будет работать со списком или другой коллекцией.

Возвращаемые значения повторения являются необходимостью для того, чтобы генератор удовлетворял необходимым статистическим свойствам случайности: вероятность рисования числа не зависит от предыдущих чисел.

Вы можете перетасовать целые числа в диапазоне от 1 до 49 и вернуть первые 6 элементов. См. http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle для получения более подробной информации о таком шаффлере.

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

Лучшим способом, вероятно, является использование random.Next(1, 49); и отклонить любое повторение. Это будет свободным от статистического уклона и того факта, что вы хотите только 6 из 49 возможностей, количество столкновений не замедлит алгоритм в значительной степени.

Используя этот метод расширения для выборки коллектора :

 public static IList TakeRandom( this IEnumerable source, int count, Random random) { var list = new List(count); int n = 1; foreach (var item in source) { if (list.Count < count) { list.Add(item); } else { int j = random.Next(n); if (j < count) { list[j] = item; } } n++; } return list; } 

Вы можете попробовать свою коллекцию следующим образом:

 var random = new Random(); var numbers = Enumerable.Range(1, 49).TakeRandom(6, random); numbers.Shuffle(random); 

Обратите внимание, что возвращаемые numbers будут равномерно отбираться из всех (49 выберите 6) возможностей для набора из 6 чисел из {1, 2, ..., 49}, но они не будут оставаться в порядке и не равномерно перетасованы. Если вы хотите иметь рандомизированный порядок, вы можете легко выполнить стандартную перестановку Fisher-Yates после этого.

 public static void Shuffle(this IList list, Random random) { for (int i = 0; i < list.Count; i++) { int j = random.Next(i, list.Count); T temp = list[j]; list[j] = list[i]; list[i] = temp; } } 

Обратите внимание, что в этом ответе можно найти более оптимизированную версию Fisher-Yates shuffle: Randomize List

  List aux = new List(); while(aux.Count < 6) { int rnd = random.Next(1,49); if(!aux.Contains(rnd))aux.add(rnd); } 

если вы поместите все тексбокс в одну панель, вы можете сделать это

  int j = 0; foreach(Control x in MyPanel.Controls) { if(x is TexBox) { x.Text = aux[j].toString(); j++; } } 

Посмотрите на использование массива для хранения ваших 6 номеров.

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

Это так просто с массивом и ООП (объектно-ориентированное программирование). Перед началом работы вы должны добавить библиотеку Linq (используя System.Linq) в свой проект.

 Random random = new Random(); int[] array = new int[6]; int number; for (int i = 0; i < 6; i++) { number = random.Next(1, 50); if (!array.Contains(number)) //If it's not contains, add number to array; array[i] = number; else //If it contains, restart random process i--; } for (int i = 1; i < 7; i++) { foreach (Control c in this.Controls) //Add random numbers to all Textboxes { if (c is TextBox && c.Name.EndsWith(i.ToString())) { c.Text = array[i - 1].ToString(); } } } 

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

Например:

 private IEnumerable RandomDigitStream(int seed) { Random random = new Random(seed); while (true) { yield return random.Next(DIGIT_MIN, DIGIT_MAX); } } private List GenerateUniqueRandomNumbers(int seed, int count) { // Assert that DIGIT_MAX - DIGIT_MIN > count to ensure // algorithm can finish return RandomDigitStream(seed) .Distinct() .Take(count) .ToList(); } 

Эффективность этого алгоритма в основном зависит от того, насколько .NET реализован командой .NET. Его использование памяти будет расти с количеством требуемых цифр и диапазоном цифр, создаваемых случайной функцией. Он также имеет непредсказуемое время работы, поскольку оно зависит от распределения вероятностей случайной функции. Фактически, этот алгоритм может застревать в бесконечном цикле, если диапазон цифр, создаваемых случайным алгоритмом, меньше числа требуемых цифр.

Однако, глядя на нее практически, это должно быть хорошо для небольшого количества цифр, но если вы смотрите на большое количество (100 +), вы можете посмотреть другие методы.

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

Это мое решение: сгенерируйте массив чисел

 ///  /// auto generate a array with number element and max value is max ///  /// number element of array /// max value of array /// array of number public static int[] createRandomArray(int number, int max) { List ValueNumber = new List(); for (int i = 0; i < max; i++) ValueNumber.Add(i); int[] arr = new int[number]; int count = 0; while (count < number) { Random rd = new Random(); int index = rd.Next(0,ValueNumber.Count -1); int auto = ValueNumber[index]; arr[count] = auto; ValueNumber.RemoveAt(index); count += 1; } return arr; } 

Да. Используйте массив. Loop Сколько раз вы хотите: Создайте случайное число, сверните через массив и сравните все с сгенерированным номером. Если есть совпадение, повторите цикл, пока не будет никакого совпадения. Затем сохраните его.

Готово:)

  • как создать смежный массив 2d в c ++?
  • Сущность не может быть построена в запросе LINQ to Entities
  • Visual Studio 2015 чрезвычайно медленная
  • Сложный объект и привязка модели ASP.NET MVC
  • Можно ли безопасно использовать OpenMP с C ++ 11?
  • Почему ссылка, не связанная с константой, не может привязываться к временному объекту?
  • NSString: простой способ удалить аккорды UTF-8 из строки?
  • Бесконечный цикл в C / C ++
  • Изображение для преобразования в ASCII
  • Не удалось загрузить файл или сборку «Microsoft.ReportViewer.Common, Version = 11.0.0.0
  • Разница между System.DateTime.Now и System.DateTime.Today
  • Interesting Posts

    Могу ли я изменить Google Chrome, чтобы предсказать мой поиск, и мгновенно посетить первый результат?

    Есть ли команда, которая позволяет мне установить предпочтительный IP-адрес для адаптера?

    Двойная загрузка ubuntu с окнами 8

    Есть ли удобный способ редактировать PATH в Windows 7?

    Как установить беспроводные драйверы без доступа в Интернет?

    Эквивалент Sprintf в Java

    Когда вы делаете подчеркивание перед переменной экземпляра?

    Как читать файлы из папки ресурсов в Scala?

    Почему Tcler предлагает подтянуть ваши `expr`essions?

    Расчет расстояния между двумя географическими точками

    Сделайте несколько зависимых / каскадных selectOneMenu выпадающих списков в JSF

    Как я могу экспортировать все адреса электронной почты, которые я отправил из Outlook или любого другого почтового клиента?

    Открыть закладки на новой вкладке

    onActivityResult (), вызванный преждевременно

    Как правильно использовать PagedResourcesAssembler из Spring Data?

    Давайте будем гением компьютера.