Как мне генерировать случайное целое число в C #?
1922
Random
Класс используется для создания случайных чисел. (Псевдослучайный, конечно.)
Пример:
Random rnd = new Random();
int month = rnd.Next(1, 13); // creates a number between 1 and 12
int dice = rnd.Next(1, 7); // creates a number between 1 and 6
int card = rnd.Next(52); // creates a number between 0 and 51
Если вы собираетесь создать более одного случайного числа, вам следует сохранить Random
экземпляр и использовать его повторно. Если вы создаете новые экземпляры слишком близко по времени, они будут производить ту же серию случайных чисел, что и генератор случайных чисел, высеянный из системных часов.
rnd
какstatic
и / или установить его только один раз при инициализации кода.Random
...Random
, которые сделают вашу случайность более надежной: ericlippert.com/2019/02/04/fixing-random-part-2 и codeblog.jonskeet.uk/2009/11/04/revisiting -randomness .Вопрос выглядит очень простым, но ответ немного сложен. Если вы видите, почти все предложили использовать класс Random, а некоторые предложили использовать крипто-класс RNG. Но тогда когда выбирать что.
Для этого нам нужно сначала понять термин СЛУЧАЙНОСТЬ и его философию.
Я бы посоветовал вам посмотреть это видео, которое углубляется в философию случайности, используя C # https://www.youtube.com/watch?v=tCYxc-2-3fY
Прежде всего, давайте поймем философию СЛУЧАЙНОСТИ. Когда мы говорим человеку выбирать между КРАСНЫМ, ЗЕЛЕНЫМ и ЖЕЛТЫМ, что происходит внутри. Что заставляет человека выбирать красный, желтый или зеленый?
Некоторая начальная мысль приходит в ум человека, который решает его выбор, это может быть любимый цвет, счастливый цвет и так далее. Другими словами, некоторый начальный триггер, который мы называем в СЛУЧАЙНОМ как SEED. Этот SEED является начальной точкой, триггером, побуждающим его выбрать СЛУЧАЙНОЕ значение.
Теперь, если SEED легко угадать, то такие виды случайных чисел называются PSEUDO, а когда семени трудно угадать, эти случайные числа называются SECURED случайными числами.
Например, человек выбирает цвет в зависимости от сочетания погоды и звука, тогда будет сложно угадать начальное зерно.
Теперь позвольте мне сделать важное заявление:
* «Случайный» класс генерирует только случайное число PSEUDO, и для генерации БЕЗОПАСНОГО случайного числа нам нужно использовать класс «RNGCryptoServiceProvider».
Случайный класс берет начальные значения из вашего процессора, что очень предсказуемо. Другими словами, случайный класс C # генерирует псевдослучайные числа, ниже приведен код этого же.
** Примечание: **
.NET Core 2.0.0+
использует другое начальное число в конструкторе без параметров: вместо тактовых частот процессора он используетGuid.NewGuid().GetHashCode()
.В то время как
RNGCryptoServiceProvider
класс использует энтропию ОС для генерации семян. Энтропия ОС - это случайное значение, которое генерируется с использованием звука, щелчков мыши и таймингов клавиатуры, температуры и т. Д. Ниже приведен код для того же.Чтобы понять энтропию ОС, посмотрите это видео с 14:30 https://www.youtube.com/watch?v=tCYxc-2-3fY, где объясняется логика энтропии ОС. Таким образом, говоря простыми словами, RNG Crypto генерирует БЕЗОПАСНЫЕ случайные числа.
источник
RandomNumberGenerator.Create()
вместо вызова конструктора,RNGCryptoServiceProvider
поскольку он доступен не на всех платформах.Каждый раз, когда вы делаете новый Random (), он инициализируется. Это означает, что в тесном цикле вы получаете одно и то же значение много раз. Вы должны сохранить один экземпляр Random и продолжать использовать Next на том же экземпляре.
источник
Random
объект. В обоих случаях я получил одно и то же случайное число. С подходом из Панкаджа этого не произошло. Возможно, это случайно , но я сомневаюсь в этом сейчас. Я запрашиваю случайное число в одну секунду из разных потоков.Остерегайтесь этого
new Random()
посеяно на текущей метке времени.Если вы хотите сгенерировать только один номер, вы можете использовать:
new Random().Next( int.MinValue, int.MaxValue )
Для получения дополнительной информации посмотрите на класс Random , хотя, пожалуйста, обратите внимание:
Поэтому не используйте этот код для генерации серии случайных чисел.
источник
new Random()
в цикле является важным моментом.источник
Я хотел добавить криптографически безопасную версию:
Класс RNGCryptoServiceProvider ( MSDN или dotnetperls )
Он реализует IDisposable.
источник
Вы можете использовать метод Jon Skeet StaticRandom внутри библиотеки классов MiscUtil, которую он построил для псевдослучайного числа.
источник
Я перепробовал все эти решения, кроме ответа на COBOL ... LOL
Ни одно из этих решений не было достаточно хорошим. Мне нужны были случайные числа в быстром для цикла int, и я получал тонны повторяющихся значений даже в очень широких диапазонах. Слишком долго соглашаясь на случайные результаты, я решил, наконец, решить эту проблему раз и навсегда.
Это все о семени.
Я создаю случайное целое число, анализируя не-цифры из Guid, а затем использую это для создания экземпляра моего класса Random.
Обновление : заполнение не требуется, если вы создаете экземпляр класса Random один раз. Так что было бы лучше создать статический класс и вызвать метод из этого.
Тогда вы можете использовать статический класс следующим образом.
Я признаю, что мне нравится этот подход лучше.
источник
Числа, генерируемые встроенным
Random
классом (System.Random), генерируют псевдослучайные числа.Если вам нужны истинные случайные числа, то самое близкое, что мы можем получить, - это «безопасный генератор псевдослучайных чисел», который можно сгенерировать с помощью криптографических классов в C #, таких как
RNGCryptoServiceProvider
.Тем не менее, если вам все еще нужны истинные случайные числа, вам нужно будет использовать внешний источник, такой как устройства, учитывающие радиоактивный распад, в качестве начального числа для генератора случайных чисел. Поскольку, по определению, любое число, генерируемое чисто алгоритмическими средствами, не может быть действительно случайным.
источник
создать случайный объект
и использовать это
вам не нужно инициализировать
new Random()
каждый раз, когда вам нужно случайное число, инициировать одно случайное число, а затем использовать его столько раз, сколько вам нужно внутри цикла или что-то ещеисточник
new Random()
использует текущие тики в качестве семян. Когда вы создаете несколько экземпляров в течение одной миллисекунды (в отличие от тика), вы получите одно и то же возвращаемое значение.Модифицированный ответ отсюда .
Если у вас есть доступ к процессору, совместимому с Intel Secure Key, вы можете генерировать реальные случайные числа и строки, используя следующие библиотеки: https://github.com/JebteK/RdRand и https://www.rdrand.com/
Просто скачайте последнюю версию отсюда , включите Jebtek.RdRand и добавьте для него оператор использования. Затем все, что вам нужно сделать, это:
Если у вас нет совместимого процессора для выполнения кода, просто используйте службы RESTful на rdrand.com. С библиотекой оболочки RdRandom, включенной в ваш проект, вам просто нужно сделать это (вы получаете 1000 бесплатных звонков при регистрации):
источник
Я использовал код ниже, чтобы иметь случайное число (не рекомендуется):
источник
Пока это нормально
Вы бы хотели контролировать лимит (минимальное и максимальное количество) большую часть времени. Таким образом, вам нужно указать, где случайное число начинается и заканчивается.
Next()
Метод принимает два параметра, мин и макс.Так что, если я хочу, чтобы мое случайное число было между 5 и 15, я бы просто сделал
источник
Это класс, который я использую. Работает как
RandomNumber.GenerateRandom(1, 666)
источник
Я хотел продемонстрировать, что происходит, когда каждый раз используется новый генератор случайных чисел. Предположим, у вас есть два метода или два класса, каждый из которых требует случайного числа. И вы наивно кодируете их так:
Как вы думаете, вы получите два разных идентификатора? НЕТ
Решение состоит в том, чтобы всегда использовать один статический генератор случайных чисел. Нравится:
источник
RNGCryptoServiceProvider
лучше позвонить в любом случае.Для сильных случайных семян я всегда использую CryptoRNG, а не Time.
источник
источник
Так же, как примечание для дальнейшего использования.
Если вы используете .NET Core, несколько экземпляров Random не так опасны, как раньше. Я знаю, что этот вопрос относится к 2010 году, но, поскольку этот вопрос старый, но имеет некоторую привлекательность, я думаю, что это хорошая вещь, чтобы задокументировать изменение.
Вы можете обратиться к этому вопросу, который я задал некоторое время назад:
Microsoft изменила случайное начальное число по умолчанию?
По сути, они изменили начальное значение по умолчанию с
Environment.TickCount
наGuid.NewGuid().GetHashCode()
, поэтому, если вы создадите 2 экземпляра Random, он не будет отображать одинаковые числа.Вы можете увидеть различия в файлах из .NET Framework / .NET Core (2.0.0+) здесь: https://github.com/dotnet/coreclr/pull/2192/commits/9f6a0b675e5ac0065a268554de49162c539ff66d
Он не так безопасен, как RNGCryptoServiceProvider, но по крайней мере он не даст вам странных результатов.
источник
Interop.GetRandomBytes((byte*)&result, sizeof(int));
.Числа, рассчитанные компьютером с помощью детерминированного процесса, по определению не могут быть случайными.
Если вам нужны настоящие случайные числа, случайность происходит из-за атмосферного шума или радиоактивного распада.
Вы можете попробовать, например, RANDOM.ORG (это снижает производительность)
источник
Поместите любые значения во вторые скобки, чтобы убедиться, что вы установили имя, написав prop и double tab для генерации кода.
источник
Если вы хотите, чтобы CSRNG генерировал случайные числа от мин до макс, это для вас. Это инициализирует
Random
классы с безопасными случайными семенами.источник
Извините, OP действительно требует случайного
int
значения, но для простой цели обмена знаниями, если вы хотите случайноеBigInteger
значение, вы можете использовать следующее утверждение:источник
Я предполагаю, что вы хотите равномерно распределенный генератор случайных чисел, как показано ниже. Случайные числа в большинстве языков программирования, включая C # и C ++, неправильно перетасовываются перед их использованием. Это означает, что вы будете получать одно и то же число снова и снова, что на самом деле не случайно. Чтобы не рисовать одно и то же число снова и снова, вам нужно семя. Как правило, тики во времени хорошо для этой задачи. Помните, что вы будете получать одно и то же число снова и снова, если будете использовать одно и то же семя каждый раз. Поэтому старайтесь всегда использовать разные семена. Время является хорошим источником для семян, потому что они всегда растеряны.
если вы ищете генератор случайных чисел для нормального распределения, вы можете использовать преобразование Бокса-Мюллера. Проверьте ответ по yoyoyoyosef в вопросе о случайной гауссовой переменной. Так как вы хотите целое число, вы должны привести двойное значение к целому в конце.
Случайные гауссовские переменные
источник
Возможно, самый простой способ -
Random.range(1, 3)
это сгенерировать число от 1 до 2.источник
Вы можете попробовать со случайным начальным значением, используя ниже:
источник
Почему бы не использовать
int randomNumber = Random.Range(start_range, end_range)
?источник
Используйте один экземпляр Random несколько раз
В этой статье рассматривается, почему случайность вызывает так много проблем, и как их решать. http://csharpindepth.com/Articles/Chapter12/Random.aspx
источник
Random
не потокобезопасный класс. Если вы создаете один экземпляр, вы должны ограничить доступ к нему за механизм блокировки.Попробуйте эти простые шаги для создания случайных чисел:
Создать функцию:
Используйте вышеуказанную функцию в месте, где вы хотите использовать случайные числа. Предположим, вы хотите использовать его в текстовом поле.
0 - это минимум, а 999 - это максимум. Вы можете изменить значения на то, что вы хотите.
источник
У меня всегда есть методы, которые генерируют случайные числа, которые помогают для различных целей. Я надеюсь, что это может помочь вам тоже:
источник
Быстро и легко для встраивания, используйте ниже код:
источник