Лекция. Генератор случайных чисел. Генератор случайных чисел
Скачать 38.92 Kb.
|
Генератор случайных чисел Очень часто в программах возникает необходимость использования случайных чисел - от заполнения массива до криптографии. Для получения последовательности случайных чисел в языке C# имеется класс Random. Этот класс предусматривает два конструктора: Random() - инициализирует экземпляр класса Random с помощью начального значения, зависящего от текущего времени. Как известно, время может быть представлено в тиках - 100-наносекундных импульсах, начиная с 1 января 0001 года. И значение времени в тиках представляет собой 64-битное целое число, которое и будет использоваться для инициализации экземпляра генератора случайных чисел. Random(Int32) - инициализирует экземпляр класса Random с помощью указанного начального значения. Такая инициализация генератора случайных чисел может быть удобна на этапе отладки программы, поскольку в этом случае при каждом запуске программы будут генерироваться одни и те же "случайные" числа. Основным методом данного класса является метод Next(), позволяющий получить случайное число и имеющий ряд перегрузок: Next() - возвращает случайное целое неотрицательное число формата Int32. Next(Int32) - возвращает случайное целое неотрицательное число, которое меньше указанного значения. Next(Int32 min, Int32 max) - возвращает случайное целое число в указанном диапазоне. При этом должно соблюдаться условие min А также методы NextBytes(Byte[]) - заполняет элементы указанного массива байтов случайными числами. NextDouble() - возвращает случайное число с плавающей запятой, в диапазоне [0,0; 1,0). Пример программы, выводящей 100 случайных чисел в диапазоне от -100 до 100. Генерация неповторяющейся последовательности чиселДля генерации последовательности неповторяющихся чисел требуется массив, в котором будут сохраняться уже сгенерированные числа. При этом каждое вновь сгенерированное число сравнивается со всеми уже сгенерированными элементами массива и, в случае несовпадения, добавляется в массив. В случае совпадения числа с одним из элементов массива генерируется новое значение для указанного элемента массива и сравнение повторяется. using System; namespace MyProgram { class Program { static void Main(string[] args) { Random rnd = new Random(); int[] a = new int[100]; a[0] = rnd.Next(0, 101); for (int i = 1; i < 100;) { int num = rnd.Next(0, 101); // генерируем элемент int j; // поиск совпадения среди заполненных элементов for (j = 0; j < i; j++) { if (num == a[j]) break; // совпадение найдено, элемент не подходит } if (j == i) { // совпадение не найдено a[i] = num; // сохраняем элемент i++; // переходим к следующему элементу } } for (int i = 0; i < 100; i++) { Console.Write("{0,4} ", a[i]); if (i % 10 == 9) Console.WriteLine(); } Console.ReadKey(); } } } Перемешивание значенийЧасто возникает задача расставить уже имеющийся набор значений в произвольном порядке. С этой целью также используется генератор случайных чисел. Для решения этой задачи создается массив и заполняется значениями, которые необходимо расставить в произвольном порядке. После этого генерируется два значения индексов массива случайным образом, и значения элементов с полученными индексами меняются местами. Процедура повторяется не менее N/2 раз, где N - количество элементов массива. using System; namespace MyProgram { class Program { static void Main(string[] args) { Random rnd = new Random(); int[] a = new int[100]; for (int i = 0; i < 100; i++) a[i] = i; for (int i = 0; i < 50; i++) { int i1 = rnd.Next(0, 100); // первый индекс int i2 = rnd.Next(0, 100); // второй индекс // обмен значений элементов с индексами i1 и i2 int temp = a[i1]; a[i1] = a[i2]; a[i2] = temp; } Console.WriteLine("Значения элементов"); for (int i = 0; i < 100; i++) { Console.Write("{0,4} ", a[i]); if (i % 10 == 9) Console.WriteLine(); } Console.ReadKey(); } } } |