Задачи по генерации случайных чисел – неотъемлемая часть программирования. Такие операции могут пригодиться как в сложных проектах, так и в более простых.
Далее предстоит разобраться с генерацией случайных чисел в Си Шарп. Нужно изучить используемые для этого методы и классы языка, рассмотреть наглядные примеры реализации. Представленная информация может понадобиться как новичкам, так и опытным разработчикам на Си Шарпе.
Псевдослучайные числа и класс Random
Random – это класс C#, используемый для генерации чисел случайным образом. Он используется для math задач разного типа. Рандом подразумевает, что в работе класса заложен алгоритм, генерирующий последовательности чисел. Они будут отвечать определенным критериям случайности.
Конструкторы Random
Random имеет два конструктора:
- Без параметров. Он будет создавать новый классовый экземпляр и инициализировать его со значением по умолчанию.
- С заданным значением. Такой конструктор дает возможность создать новый экземпляр Random с последующей инициализацией с установленными параметрами.
Первый вариант в Си Шарп и .NET Framework не имеет строго установленного значения по умолчанию. Оно зависит от нынешнего времени. В .Net Core и более поздних версиях платформы начальный параметр по умолчанию задается генераторов псевдослучайных чисел потока. Конструкторы без параметров встречаются чаще всего. Они дают возможность создать генератор случайных чисел, поддерживающий оптимальную производительность и вероятностью распределения случайных величин.
Пример создания экземпляра Random через конструктор без параметров:
Random rnd = new Random ();
Конструктор Рандом с параметров выглядит несколько иначе:
Random rnd = new Random (99);
Конструктор с параметром рекомендуется применять тогда, когда требуется получать все время одну и ту же серию псевдослучайных чисел. Пример – это отладка написанного программного обеспечения.
Наглядный пример
Конструктор Рандом с параметром лучше рассматривать на наглядном примере. Пусть будет дан такой код:
Тут создается массив, включающий в себя пять псевдослучайных байтов. Результат обработки кода выводится в консоль. Если трижды запустить эту math задачу (приложение), на экране появится такая ситуация
Три запуска – это три различающиеся между собой серии случайных чисел. Далее для наглядного примера работы генератора воспользуемся конструктором с начальным значением. Его код будет выглядеть так:
Random rnd = new Random (100);
// то же самое, что и в примере, приведенном выше.
После обработки кода на экране появятся такие записи:
Три запуска приведут к появлению серии из одинаковых чисел. Теперь разница конструкторов у Рандома будет более понятной.
Методы и свойства
Для генерации случайных чисел у Random имеются различные methods:
Что за метод | Характеристика |
Next | Используется для возврата неотрицательного случайного числа. |
Next (Int i) | Вернет неотрицательное случайное число, которое будет меньше i. |
Next (int10, Int10) | Используется для возврата числа в заданном диапазоне |
NextBytes(Byte[]) | Применяется для заполнение элементов массива байтов. |
NextDouble () | Вернет случайное число с плавающей запятой, которое >= 0.0 и меньше единицы. |
NextSingle() | Method, используемый для возврата компонента с плавающей запятой. Установленный диапазон – от 0.0 до 1.0. |
Вот – наглядный пример использования рассматриваемого класса в C#:
Чтобы вывести всего одно rand число, используется метод Next:
При применении класса в потоках рекомендуется задействовать потокобезопасные экземпляры. Делается это через свойство Shared:
Выше – наглядный пример реализации соответствующего параметра в коде.
Особенности работы метода Next
Вот – пример элементарного генератора случайных чисел:
Здесь используется Next единожды. Если воспользоваться им несколько раз подряд, система выведет в консоль разные значения:
Код, указанный выше, поможет отобразить 4 сгенерированных random числа. Это элементарная задача.
Более сложный случай – когда требуется получить компонент из заданного диапазона:
Для этого метод Next вызывается с двумя параметрами. Первый отображает нижнюю границу, второй – верхнюю. Допускается ограничение только верхних границ. Для этого Next вызывается с одним параметром. Соответствующий компонент будет указывать на верхнюю границу заданного диапазона.
Чтобы задать начальное значение для генератора, потребуется использовать следующий шаблон:
Начальное значение применяется для генерации чисел, а не для возвращения первого числа.
Если несколько разных объектов класса Random одинаково инициализируются, они возвращают одинаковые значения. Вот наглядный пример такой ситуации:
Этот фрагмент приведет к выводу трех одинаковых значений. Каждый раз при вызове 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 чисел. |
А вот так выглядит пример использования перечисленных методов в программном коде:
При использовании данного класса тоже могут возникнуть некоторые трудности.
Проблемы RandomNumberGenerator
RandomNumberGenerator использует в своей работе более сложные алгоритмы. Они будут более «тяжелыми». Такая концепция сказывается на скорости обработки информации. Это приводит к тому, что RandomNumberGenerator при остальных равных условиях в конечном итоге будет функционировать на порядок медленнее, чем Random.
Выше – пример таблицы со скоростью генерации 1 000 000 величин для каждого изученного класса. Время указано в миллисекундах.
Секрет быстрого изучения
Любой вопрос, связанный с программированием на C#, поможет решить Google или иной поисковик. Там полно туториалов и документации по интересующим пользователя вопросам. Но лучше для быстрого обучения разработке на понравившемся языке воспользоваться дистанционными онлайн курсами. Пример – от образовательного центра OTUS.
Такие курсы выделяются:
- хорошо продуманной и сжатой программой обучения;
- сроками обучения – до 12 месяцев;
- возможностью совмещения с обыденной жизнью, семьей и работой – обучение строится через интернет;
- правом выбрать сразу несколько направлений для изучения в зависимости от имеющихся начальных знаний;
- богатой практикой и интересными домашними заданиями;
- кураторством опытными специалистами;
- помощью в формировании портфолио.
В конце обучения всем завершившим курс по C# будет выдан электронный сертификат, подтверждающий спектр приобретенных навыков и знаний.