Неповторное случайное число
Чтобы генерировать случайные числа от 1- 20, мне нужно выбрать выборочное, и оно не должно повторяться.
Как это сделать в C #
Примечание. Мне нужно прокручивать так, как это
- Создать случайную дату рождения
- Как я могу генерировать случайные буквенно-цифровые строки в C #?
- Как генерировать случайные целые числа в определенном диапазоне в Java?
- Почему кажется, что мой генератор случайных чисел не является случайным в C #?
- Случайное число между двумя двойными номерами
Random rnd = new Random() rnd.Next(1,20) for(int i =0; i<=20;i++) { }
Для всех циклов число должно быть от 1 до 20
- Получение случайного элемента из ArrayList
- Выберите уникальные случайные числа
- Эффективное определение случайных чисел
- Рекомендуемый способ инициализации srand?
- Как получить случайную запись из базы данных MS Access
- Как создать случайную буквенно-цифровую строку в C ++?
- Создание случайного числа между 1 и 10 Java
- Повторение случайных величин в VBA
Что именно вы подразумеваете под «не должно повторяться»? Если вы имеете в виду, что вы не хотите получать какие-либо дубликаты, тогда вы должны в основном взять список чисел 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)); }