Неповторное случайное число

Чтобы генерировать случайные числа от 1- 20, мне нужно выбрать выборочное, и оно не должно повторяться.

Как это сделать в C #

Примечание. Мне нужно прокручивать так, как это

Random rnd = new Random() rnd.Next(1,20) for(int i =0; i<=20;i++) { } 

Для всех циклов число должно быть от 1 до 20

Что именно вы подразумеваете под «не должно повторяться»? Если вы имеете в виду, что вы не хотите получать какие-либо дубликаты, тогда вы должны в основном взять список чисел 1-20, перетасовать их, а затем захватить по одному из заголовка списка. Чтобы эффективно перетасовать список, см. Этот ответ переполнения стека .

Если вы просто имеете в виду, что ваша текущая попытка дает 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2 и т.д. вы создаете новый экземпляр Random каждый раз, когда вы выбираете номер: не делайте этого. Каждый раз, когда вы создаете экземпляр, он будет использовать текущее время как «семя» для генератора случайных чисел (если вы не укажете его явно). Это означает, что если вы создадите несколько экземпляров в быстрой последовательности, каждый получит одно и то же семя и, следовательно, даст ту же последовательность чисел.

Вместо этого используйте один экземпляр Random и повторно используйте его. (Обратите внимание, что это не streamобезопасно, хотя это боль.) Например:

 private static readonly Random Rng = new Random(); public int NextNumber() { return Rng.Next(20) + 1; } 

Это не будет streamобезопасным, но сообщите нам, если это проблема. Альтернативой иногда является передача Random в метод (который, конечно, будет, конечно, более сложным, конечно):

 public int NextNumber(Random rng) { return rng.Next(20) + 1; } 

то вызывающий может повторно использовать экземпляр соответствующим образом.

Если вам нужен streamобезопасный способ генерации случайных чисел, вы можете посмотреть мой class StaticRandom в MiscUtil .

(Обратите внимание, что использование rng.Next(1, 21) также будет работать нормально – я предпочитаю версию выше, поскольку я думаю, что она уменьшает догадки об инклюзивных / эксклюзивных границах, но это вопрос личного вкуса.)

Этот метод будет генерировать все числа, и числа не будут повторяться:

 ///  /// Returns all numbers, between min and max inclusive, once in a random sequence. ///  IEnumerable UniqueRandom(int minInclusive, int maxInclusive) { List candidates = new List(); for (int i = minInclusive; i <= maxInclusive; i++) { candidates.Add(i); } Random rnd = new Random(); while (candidates.Count > 0) { int index = rnd.Next(candidates.Count); yield return candidates[index]; candidates.RemoveAt(index); } } 

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

 Console.WriteLine("All numbers between 0 and 20 in random order:"); foreach (int i in UniqueRandom(0, 20)) { Console.WriteLine(i); } 

Реализация IEnumerable , основанная на ответе Халлгрима :

 public class UniqueRandoms : IEnumerable { Random _rand = new Random(); List _candidates; public UniqueRandoms(int maxInclusive) : this(1, maxInclusive) { } public UniqueRandoms(int minInclusive, int maxInclusive) { _candidates = Enumerable.Range(minInclusive, maxInclusive - minInclusive + 1).ToList(); } public IEnumerator GetEnumerator() { while (_candidates.Count > 0) { int index = _rand.Next(_candidates.Count); yield return _candidates[index]; _candidates.RemoveAt(index); } } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); } } 

Я сделал это так немного назад. Я не знаю, как это сравнивается с другими методами, представленными в отношении эффективности, случайности и т. Д. Но, похоже, это работает:

 List integers = new List() { 1, 2, 3, 4, 5, 6,7, 8, 9, 10, 11, 12 }; Random rnd = new Random(); var ints = from i in integers orderby rnd.Next(integers.Count) select i; 

Из MSDN

«Один из способов улучшить случайность – это сделать начальное значение зависящим от времени».

Другой факт

вы должны «создать один Случайный, чтобы генерировать множество случайных чисел с течением времени». Это улучшит случайное генерирование

 class Program { static void Main(string[] args) { List list = new List(); int val; Random r; int IntialCount = 1; int count = 7 ; int maxRandomValue = 8; while (IntialCount <= count) { r = new Random(); val = r.Next(maxRandomValue); if (!list.Contains(val)) { list.Add(val); IntialCount++; } } } } 

Следующий способ очень хороший, я использую строку здесь, вы можете изменить тип списка на все, что хотите …, попробуйте:

  List NamesList = new List() { "Name1", "Name2", "Name3", "Name4", "Name5" }; Random rnd = new Random(); //Now to get random of the above "Without Repeating.." for (int i = 0; i <= NamesList.Count - 1; i++) { int TheSelectedRand = rnd.Next(NamesList.Count); string MyRandNumber = NamesList[TheSelectedRand]; //Print or use your item here NamesList.Remove(NamesList[TheSelectedRand]); } 

blow code генерирует 65 уникальных случайных чисел между 0 – 92 и возвращает это уникальные случайные числа в массиве.

 public static int[] RandomNumbers_Supplier() { Random R = new Random(); int[] RandomNumbers = new int[65]; int k = 0, Temp; bool IsRepetitive = false; while (k < 65) { Temp = R.Next(0, 92); for (int i = 0; i < 65; i++) { IsRepetitive = false; if (RandomNumbers[i] == Temp) { IsRepetitive = true; break; } } if (!IsRepetitive) { RandomNumbers[k] = Temp; k++; } } return(RandomNumbers) } 
 static void Main(string[] args) { //Randomize 15 numbers out of 25 - from 1 to 25 - in ascending order var randomNumbers = new List(); var randomGenerator = new Random(); int initialCount = 1; for (int i = 1; i <= 15; i++) { while (initialCount <= 15) { int num = randomGenerator.Next(1, 26); if (!randomNumbers.Contains(num)) { randomNumbers.Add(num); initialCount++; } } } randomNumbers.Sort(); randomNumbers.ForEach(x => Console.WriteLine(x)); } 
  • Есть ли возможность генерировать случайный символ в Java?
  • Как настроить пользовательское семя для генератора псевдослучайных чисел
  • Создание уникальных случайных чисел в Java
  • Math.random () против Random.nextInt (int)
  • Получение случайных чисел в Java
  • Случайные точки внутри параллелограмма
  • Как работает ORDER BY RAND () MySQL?
  • Случайность Java всегда возвращает тот же номер, когда я устанавливаю семя?
  • Требует ли std :: mt19937 разминки?
  • Как я засеваю случайный class, чтобы избежать дублирования случайных значений
  • Создание случайного цвета в Java?
  • Interesting Posts

    Дедупликатор музыкальной библиотеки

    Это нормально для Dell Inspiron 530, чтобы иметь вентилятор, чтобы вращаться 3 раза, прежде чем он ПОСТЫ?

    Извлечь p-значение из aov

    Каковы все страницы «about:» в Internet Explorer?

    Получить новый идентификатор первичного ключа записи из запроса вставки mysql?

    как слушать N каналов? (оператор динамического выбора)

    Получить имя хоста текущего запроса в node.js Express

    Скопировать текущий путь в буфер обмена или выбрать адресную строку в Total Commander

    Существует ли NAS, который может действовать как «простой», «немой» USB-накопитель?

    Невозможно воспроизвести ни видео IE10 HTML5, ни видео приложений с современным интерфейсом

    Не удалось загрузить файл или сборку … Была сделана попытка загрузить программу с неправильным форматом (System.BadImageFormatException)

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

    Отключите активацию панели меню, когда Alt нажата в Windows 7

    Как я могу сохранить состояние своей программы и загрузить ее?

    Автоматический повторный набор для VPN-соединений PPTP в Windows 8

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