Рубріки: Теория

C# Random: заготовленные случайности

Сергій Бондаренко

Определенные типы задач, которые решает разработчик, требуют от него использования случайных величин. Предположим, нужно имитировать случайное выпадение какой-то грани игрального кубика или бросить жребий, выбрав вариант «орел» или «решка». В C# есть возможность «подбросить монетку» и взять псевдослучайные числовые значения.  Они генерируются классом Random. Вот о нем и предлагаем поговорить более подробно.

Содержание:

1. Класс Random
2. Зерно выборки
3. Получение произвольных дробных чисел
4. Перемешивание букв в слове
5. Генерация печатных символов в массив
6. Создание массива со случайными числами
7. Заключение

Класс Random

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

namespace KUBIK_POKER
{
    class Program
    {
        static void Main(string[] args) 
        {
            for (int i = 1; i < 6; i++) //Цикл на 5 “бросков” 
            {
                Random sluchainaya_velichina = new Random(); //обращение к классу случайных величин
                int kubik = sluchainaya_velichina.Next(1, 6); //переменная kubik принимает значение от 1 до 6 
                Console.Write(kubik + " | "); //   Вывод на экран результата броска
            }

        }
    }
}

Мы использовали метод Next и указали в качестве аргумента диапазон значений (левое число включается, правое — нет).

Зерно выборки

При использовании генератора случайных чисел следует иметь в виду, что метод генерации является псевдослучайным. Он ориентируется на таком параметре как «зерно выборки» (seed), которое определяет псевдослучайное значение. Для имитации этого «зерна выборки» используются внутренние системные параметры, которые все время меняются, например, текущее время. Если вы будете использовать в коде «зерно выборки» с одним и тем же числовым значением, то и величина на выходе будет одной и той же.

Например:

{
    static void Main(string[] args)

    {
        static int GetRandom()
    {
        Random highlight_today = new Random(198); // Использование зерна выборки
        int value = highlight_today.Next();
        return value;
    }
        Console.WriteLine(GetRandom());
        Console.WriteLine(GetRandom());
        Console.WriteLine(GetRandom());
    }
}

Получение произвольных десятичных цифр

Дробные числа от нуля до единицы генерируются в C# при помощи метода double floating_point = random.NextDouble(). Когда необходимо получать величины с дробной частью, можно складывать сгенерированную псевдослучайную дробную часть со сгенерированной целой частью числа:

namespace drobniy
{
    class Program
    {
        static void Main(string[] args)
        {
            Random sluchainoe_chislo = new Random();
            double floating_point = sluchainoe_chislo.NextDouble()+sluchainoe_chislo.Next();
            Console.WriteLine(floating_point);

        }
    }
}

Существуют и другие способы получения дробных чисел, например, простым умножением дробного числа на 10, 100, 1000 и так далее.

Перемешивание букв в слове

Используя тот же инструмент, можно создать эффект «случайности» для выбора букв. Допустим, нужно взять текст и произвольно расставить символы из которых он состоит, образуя «перевертыш», например, для шарады. Код для реализации такой задачи выглядит следующим образом:

using System;
using System.Text;
class Program
{
        static void Main(string[] args)
    {
        Console.WriteLine("Введите слово:");
        string? perevertish = Console.ReadLine(); // ввод исходного текста
        Console.WriteLine(word(perevertish));
        static string word(string input)
        {
            StringBuilder result = new StringBuilder();
            int dlina_slova = input.Length; //определение длины слова
            int j;                                         // назначение переменной
            Random r = new Random();   //объявление класса Random 

            for (int i = 0; i < dlina_slova; i++)  //создание цикла по длине слова
            {
                j = r.Next(input.Length);       // применение случайного значения
                result.Append(input[j]);         //добавление к строке подстроки
                input = input.Remove(j, 1);
            }

            return result.ToString();

        }
    }
}

Генерация печатных символов в массив

Для получения случайных чисел можно прибегнуть к инструменту Array. Предположим, нам необходимо получить произвольную выборку из 20 имеющихся в наличии символов. Это может выглядеть так:

using System.Linq;
namespace sluchainiy_simvol
{
    class Program
    {
        private static Random sluchain_vybor = new Random();
        static void Main(string[] args)
        {
            const string chars = "йцукенгшщзхъфывапролджэячсмитьбю0123456789";
            var finish = (from vybor in Enumerable.Repeat(chars, 20)
                          select vybor[sluchain_vybor.Next(vybor.Length)]).ToArray();
            string resultat = new string(finish);
            Console.WriteLine("Случайные 20 символов - " + resultat);

            Console.ReadLine();
        }

    }
}

Создание массива со случайными числами

Код следующего приложения позволяет генерировать случайную комбинацию чисел, наполняя массив. Число элементов (размер массива) возьмем равным 17:

{
           class Program
        {
            static  Random ranGen = new Random();
            static void Main(string[] args)
            {
                const int arrayLength = 17, randomMinimum = 0, randomMaximum = 101;
                var randomMassiv = new int[arrayLength];

                for (int i = 0; i < arrayLength; i++)
                {
                    randomMassiv[i] = ranGen.Next(randomMinimum, randomMaximum);
                }
                foreach (var item in randomMassiv)
                {
                    Console.WriteLine(item.ToString());
                }
                Console.ReadLine();
            }
        }
    }

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

namespace WindowsFormsApp7
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();

             int num_letters = int.Parse(textBox1.Text); Ввод количества букв в слове
            int num_words = int.Parse(textBox2.Text); Ввод количества слов

            // Создаем массив букв, которые мы будем использовать.
            char[] letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray(); //массив символов

            Random rand = new Random();  // Генератор случайного выбора
       
            for (int i = 1; i <= num_words; i++)   // Цикл для количества слов
            {
                string word = "";
                for (int j = 1; j <= num_letters; j++)
                {
                    // Выбор случайного числа от 0 до 25
                    // для выбора буквы из массива букв.
                    int letter_num = rand.Next(0, letters.Length - 1);
                    word += letters[letter_num];
                }
                listBox1.Items.Add(word);  // Добавление нового слова в список
            }
        }
    }
}

Заключение

Генератор случайных чисел в C# позволяет реализовать огромный спектр задач — от статистического моделирования до случайного розыгрыша в играх. Однако, используя данный инструмент, следует помнить, что в его основе лежит псевдослучайный метод, который не всегда подойдет для моделирования ситуации.

Для закрепления информации рекомендуем посмотреть видео, на котором объяснены основные принципы использования модуля случайных величин в C#:

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023