Класс Random и его функции
Умение генерировать случайные числа требуется во многих приложениях. Класс Random содержит все необходимые для этого средства. Класс Random имеет конструктор класса: для того, чтобы вызы-вать методы класса, нужно вначале создавать экземпляр (объект) класса. Созданный объект обеспечи-вает получение псевдослучайных (почти случайных…J) чисел. Этим Random отличается от класса Math, у которого все поля и методы – статические, что позволяет обойтись без создания экземпляров класса Math.
Как всякий "настоящий" класс, класс Random является наследником класса Object, а, следовательно, имеет в своём составе и методы родителя. Рассмотрим часть оригинальных методов класса Random, используемых для генерирования последовательностей случайных чисел.
Начнём рассмотрение с конструктора класса. Конструктор обеспечивает создание объектов класса. Он имеет две реализации. Одна из них позволяет генерировать неповторяющиеся при каждом запуске серии случайных чисел. Начальный элемент такой серии строится на основе текущей даты и времени, что гарантирует уникальность серии. Этот конструктор вызывается без параметров. Он описан как Random(). Другой конструктор с параметром целого типа – Random(int) обеспечивает важную возмож-ность генерирования повторяющейся серии случайных чисел. Параметр конструктора используется для построения начального элемента серии, поэтому при задании одного и того же значения параметра се-рия будет повторяться.
Перегруженный метод Next() при каждом вызове возвращает положительное целое, равномерно рас-пределённое в некотором диапазоне. Диапазон задаётся параметрами метода. Три реализации метода отличаются набором параметров:
1. Next () – метод без параметров выдаёт целые положительные числа во всём положительном диапазоне типа int;
2. Next (max) – выдаёт целые положительные числа в диапазоне [0, max];
3. Next (min, max) – выдаёт целые положительные числа в диапазоне [min, max].
Метод NextDouble() имеет одну реализацию. При каждом вызове этого метода выдаётся новое слу-чайное число, равномерно распределённое в интервале [0, 1].
Ещё один полезный метод класса Random позволяет при одном обращении получать целую серию случайных чисел. Метод имеет параметр – массив, который и будет заполнен случайными числами.
Метод описан как NextBytes(buffer). Так как параметр buffer представляет массив байтов, то, естест-венно, генерированные случайные числа находятся в диапазоне [0, 255].
Рассмотрим пример работы со случайными числами:
/// <summary>
/// Эксперименты с классом Random
/// </summary>
public void Rand()
{
const int initRnd = 77;
Random realRnd = new Random();
Random repeatRnd = new Random(initRnd);
// случайные числа в диапазоне [0,1)
Console.WriteLine("случайные числа в диапазоне[0,1)");
for(int i =1; i <= 5; i++)
{
Console.WriteLine("Число " + i + "= "
+ realRnd.NextDouble() );
}
// случайные числа в диапазоне[min,max]
int min = -100, max=-10;
Console.WriteLine(«случайные числа в диапазоне [" +
min +"," + max + "]«);
for(int i =1; i <= 5; i++)
{
Console.WriteLine(«Число » + i + «= «
+ realRnd.Next(min,max) );
}
// случайный массив байтов
byte[] bar = new byte[10];
repeatRnd.NextBytes(bar);
Console.WriteLine(«Массив случайных чисел в диапазоне
[0, 255]«);
for(int i =0; i < 10; i++)
{
Console.WriteLine(«Число » + i + «= » +bar[i]);
}
}//Rand
Приведу краткий комментарий к тексту программы. Вначале создаются два объекта класса Random. У этих объектов разные конструкторы. Объект с именем realRnd позволяет генерировать неповторяющиеся серии случайных чисел. Объект repeatRnd дает возможность повторить при необходимости серию. Метод NextDouble создает серию случайных чисел в диапазоне [0, 1). Вызываемый в цикле метод Next с двумя параметрами создает серию случайных положительных целых, равномерно распределенных в диапазоне [-100, -10]. Метод NextBytes объекта repeatRnd позволяет получить при одном вызове массив случайных чисел из диапазона [0, 255]. Результаты вывода можно увидеть на рис. 7.2.
Рис. 7.2. Генерирование последовательностей случайных чисел в процедуре Rand
На этом заканчивается рассмотрение темы выражений языка C#.
е double в тип bool приводит к ошибке, потому и закомментировано.
Массив как параметр
Так как имя массива фактически является ссылкой, то он передается в метод по ссылке и, следовательно, все изменения элементов массива, являющегося формальным параметром, отразятся на элементах соответствующего массива, являющимся фактическим параметром.
Рассмотрим пример передачи массива как параметра:
class Program
{
static void Print(int n, int[] a) //n – размерность массива, а – ссылка на массив
{
for (int i = 0; i < n; i++) Console.Write("{0} ", a[i]);
Console.WriteLine();
}
static void Change(int n, int[] a)
{
for (int i = 0; i < n; i++)
if (a[i] > 0) a[i] = 0; // изменяются элементы массива
}
static void Main()
{
int[] myArray = { 0, -1, -2, 3, 4, 5, -6, -7, 8, -9 };
Print(10, myArray);
Change(10, myArray);
Print(10, myArray);
}
}
Задание. Измените программу так, чтобы метод Change удваивал значения положительных элементов массива.
Массив как объект
Мы уже говорили о том, что массивы в С# реализованы как объекты. Если говорить более точно, то они реализованы на основе базового класса Array, определенного в пространстве имен System. Данный класс содержит различные свойства и методы. Например, свойство Length позволяет определять количество элементов в массиве. Преобразуем предыдущий пример:
class Program
{
static void Print(int[] a) // передаем только ссылку на массив
{
for (int i = 0; i < a.Length; i++) Console.Write("{0} ", a[i]);
Console.WriteLine();
}
static void Change(int[] a)
{
for (int i = 0; i < a.Length; i++)
if (a[i] > 0) a[i] = 0;
}
static void Main()
{
int[] myArray = { 0, -1, -2, 3, 4, 5, -6, -7, 8, -9 };
Print(myArray);
Change(myArray);
Print(myArray);
}
}
Другие свойства и методы класса Array приведены в следующей таблице:
Элемент | Вид | Описание |
Length | свойство | Количество элементов массива (по всем размерностям) |
BinarySearch | статический метод | Двоичный поиск в отсортированном массиве |
Clear | статический метод | Присваивание элементам массива значений по умолчанию |
Copy | статический метод | Копирование заданного диапазона элементов одного массива в другой |
CopyTo | экземплярный метод | Копирование всех элементов текущего одномерного массива в другой массив |
GetValue | экземплярный метод | Получение значения элемента массива |
IndexOf | статический метод | Поиск первого вхождения элемента в одномерный массив |
LastIndexOf | статический метод | Поиск последнего вхождения элемента в одномерный массив |
Reverse | статический метод | Изменение порядка следования элементов на обратный |
SetValue | экземплярный метод | Установка значения элемента массива |
Sort | статический метод | Упорядочивание элементов одномерного массива |
Вызов статических методов происходит через обращение к имени класса, например, Array.Sort(myArray). В данном случае мы обращаемся к статическому методу Sort класса Array и передаем данному методу в качестве параметра объект myArray - экземпляр класса Array.
Обращение к свойству или вызов экземплярного метода производится через обращение к экземпляру класса, например, myArray.Length или myArray.GetValue(i).
Пример:
class Program
{
static void Main()
{
try
{
int[] MyArray;
Console.Write("Введите размерность массива: ");
int n = int.Parse(Console.ReadLine());
MyArray = new int[n];
for (int i = 0; i < MyArray.Length; ++i)
{
Console.Write("a[{0}]=",i);
MyArray[i] = int.Parse(Console.ReadLine());
}
PrintArray("исходный массив:", MyArray);
Array.Sort(MyArray);
PrintArray("массив отсортирован по возрастанию", MyArray);
Array.Reverse(MyArray);
PrintArray("массив отсортирован по убыванию", MyArray);
}
catch (FormatException)
{
Console.WriteLine("неверный формат ввода данных");
}
catch (OverflowException)
{
Console.WriteLine("переполнение");
}
catch (OutOfMemoryException)
{
Console.WriteLine("недостаточно памяти для создания нового объекта");
}
}
static void PrintArray(string a, int[] mas)
{
Console.WriteLine(a);
for (int i = 0; i < mas.Length; i++) Console.Write("{0} ", mas[i]);
Console.WriteLine();
}
}
}
Задание. Добавьте в программу метод InputArray, предназначенный для ввода с клавиатуры элементов массива. Продемонстрируйте работу данного метода.
Дата добавления: 2017-06-02; просмотров: 1092;