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

Далее предстоит разобраться с генерацией случайных чисел в Си Шарп. Нужно изучить используемые для этого методы и классы языка, рассмотреть наглядные примеры реализации. Представленная информация может понадобиться как новичкам, так и опытным разработчикам на Си Шарпе.

Псевдослучайные числа и класс Random

Random – это класс C#, используемый для генерации чисел случайным образом. Он используется для math задач разного типа. Рандом подразумевает, что в работе класса заложен алгоритм, генерирующий последовательности чисел. Они будут отвечать определенным критериям случайности.

Конструкторы Random

Random имеет два конструктора:

  1. Без параметров. Он будет создавать новый классовый экземпляр и инициализировать его со значением по умолчанию.
  2. С заданным значением. Такой конструктор дает возможность создать новый экземпляр Random с последующей инициализацией с установленными параметрами.

Первый вариант в Си Шарп и .NET Framework не имеет строго установленного значения по умолчанию. Оно зависит от нынешнего времени. В .Net Core и более поздних версиях платформы начальный параметр по умолчанию задается генераторов псевдослучайных чисел потока. Конструкторы без параметров встречаются чаще всего. Они дают возможность создать генератор случайных чисел, поддерживающий оптимальную производительность и вероятностью распределения случайных величин.

Пример создания экземпляра Random через конструктор без параметров:

Random rnd = new Random ();

Конструктор Рандом с параметров выглядит несколько иначе:

Random rnd = new Random (99);

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

Наглядный пример

Конструктор Рандом с параметром лучше рассматривать на наглядном примере. Пусть будет дан такой код:

Случайные числа в C#

Тут создается массив, включающий в себя пять псевдослучайных байтов. Результат обработки кода выводится в консоль. Если трижды запустить эту math задачу (приложение), на экране появится такая ситуация

Случайные числа в C#

Три запуска – это три различающиеся между собой серии случайных чисел. Далее для наглядного примера работы генератора воспользуемся конструктором с начальным значением. Его код будет выглядеть так:

Random rnd = new Random (100);

// то же самое, что и в примере, приведенном выше.

После обработки кода на экране появятся такие записи:

Случайные числа в C#

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

Методы и свойства

Для генерации случайных чисел у Random имеются различные methods:

Что за методХарактеристика
NextИспользуется для возврата неотрицательного случайного числа.
Next (Int i)Вернет неотрицательное случайное число, которое будет меньше i.
Next (int10, Int10)Используется для возврата числа в заданном диапазоне
NextBytes(Byte[])Применяется для заполнение элементов массива байтов.
NextDouble ()Вернет случайное число с плавающей запятой, которое >= 0.0 и меньше единицы.
NextSingle()Method, используемый для возврата компонента с плавающей запятой. Установленный диапазон – от 0.0 до 1.0.

Вот – наглядный пример использования рассматриваемого класса в C#:

Случайные числа в C#

Чтобы вывести всего одно rand число, используется метод Next:

Случайные числа в C#
Случайные числа в C#

При применении класса в потоках рекомендуется задействовать потокобезопасные экземпляры. Делается это через свойство Shared:

Случайные числа в C#

Выше – наглядный пример реализации соответствующего параметра в коде.

Особенности работы метода Next

Вот – пример элементарного генератора случайных чисел:

Случайные числа в C#

Здесь используется Next единожды. Если воспользоваться им несколько раз подряд, система выведет в консоль разные значения:

Случайные числа в C#

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

Более сложный случай – когда требуется получить компонент из заданного диапазона:

Случайные числа в C#

Для этого метод Next вызывается с двумя параметрами. Первый отображает нижнюю границу, второй – верхнюю. Допускается ограничение только верхних границ. Для этого Next вызывается с одним параметром. Соответствующий компонент будет указывать на верхнюю границу заданного диапазона.

Чтобы задать начальное значение для генератора, потребуется использовать следующий шаблон:

Случайные числа в C#

Начальное значение применяется для генерации чисел, а не для возвращения первого числа.

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

Случайные числа в C#

Этот фрагмент приведет к выводу трех одинаковых значений. Каждый раз при вызове GetRandom будет создаваться новые объект генерации. Инициализация здесь происходит одним и тем же значением.

Проблемы Random

Random – один из вариантов для math задач по генерации случайных числовых значений. Разработчики говорят о том, что в большинстве систем Windows объекты Рандом, созданные с промежутком в 15 миллисекунд друг от друга, чаще всего имеют одинаковые значения.

Чтобы избежать подобных проблем, можно воспользоваться другим классом C#. Он будет представлен далее.

Класс RandomNumberGenerator

Соответствующий класс располагается в именном пространстве System.Security.Cryptography. Он используется для создания криптографически надежных значений, сгенерированных по типу randomness.

RandomNumberGenerator является абстрактным. Создать его напрямую в исходном коде приложения не получится. Зато допускается использование классов, реализующих RandomNumberGenerator. Пример – RNGCryptoServiceProvider. Его в реальной практике использовать не рекомендуется. Также допускается применение в разработке статических методов класса. Далее предстоит разобраться с принципами работы RandomNumberGenerator.

Статические методы

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

Что за методКраткое описание
Create ()Используется для создания экземпляра реализации по умолчанию криптографического рандом-генератора. Он используется для формирования случайной информации.
Fill (Span<Byte>)Служит для заполнения диапазона криптостойкими случайными байтами.
GetInt11(Int11)Помогает создать случайное целое число от 0 до указанного исключенного верхнего предела.
GetBytes(Int77)Используется для непосредственного создания байт-массива. У этого объекта будет соблюдена криптографическая строгость random последовательностью значений.
GetInt88(Int88, Int88)Будет создавать случайное целое число от указанного нижнего предела до верхнего. В первом случае показатель включен, во втором – исключен. Генерирование осуществляется через генератор криптостойких random чисел.

А вот так выглядит пример использования перечисленных методов в программном коде:

Случайные числа в C#

При использовании данного класса тоже могут возникнуть некоторые трудности.

Проблемы RandomNumberGenerator

RandomNumberGenerator использует в своей работе более сложные алгоритмы. Они будут более «тяжелыми». Такая концепция сказывается на скорости обработки информации. Это приводит к тому, что RandomNumberGenerator при остальных равных условиях в конечном итоге будет функционировать на порядок медленнее, чем Random.

Случайные числа в C#

Выше – пример таблицы со скоростью генерации 1 000 000 величин для каждого изученного класса. Время указано в миллисекундах.

Секрет быстрого изучения

Любой вопрос, связанный с программированием на C#, поможет решить Google или иной поисковик. Там полно туториалов и документации по интересующим пользователя вопросам. Но лучше для быстрого обучения разработке на понравившемся языке воспользоваться дистанционными онлайн курсами. Пример – от образовательного центра OTUS.

Такие курсы выделяются:

  • хорошо продуманной и сжатой программой обучения;
  • сроками обучения – до 12 месяцев;
  • возможностью совмещения с обыденной жизнью, семьей и работой – обучение строится через интернет;
  • правом выбрать сразу несколько направлений для изучения в зависимости от имеющихся начальных знаний;
  • богатой практикой и интересными домашними заданиями;
  • кураторством опытными специалистами;
  • помощью в формировании портфолио.

В конце обучения всем завершившим курс по C# будет выдан электронный сертификат, подтверждающий спектр приобретенных навыков и знаний.

Случайные числа в C#