1) Класс Math:
Кроме переменных и констант, первичным материалом для построения выражений являются функции. Большинство их в проекте будут созданы самим программистом (мы будем с этим фактом разбираться в следующих статьях), но не обойтись и без встроенных функций. Умение работать в среде Visual Studio.Net предполагает знание встроенных возможностей этой среды, знание возможностей каркаса Framework.Net, пространств имён, доступных при программировании на языке C#, а также соответствующих встроенных классов и функций этих классов. Продолжим знакомство с возможностями, предоставляемыми пространством имён System. Давайте рассмотрим ещё один класс – класс Math, содержащий стандартные математические функции, без которых трудно обойтись при построении многих выражений. Этот класс содержит два статических поля E (число е) и PI (число ПИ), а также 23 статических метода. Методы задают:
- тригонометрические функции – Sin, Cos, Tan;
- обратные тригонометрические функции – ASin, ACos, ATan, ATan2 (sinx, cosx);
- гиперболические функции – Tanh, Sinh, Cosh;
- экспоненту и логарифмические функции – Exp, Log, Log10;
- модуль, корень, знак – Abs, Sqrt, Sign;
- функции округления – Ceiling, Floor, Round;
- минимум, максимум, степень, остаток – Min, Max, Pow, IEEERemainder.
В особых пояснениях эти функции не нуждаются. Как они выполняются, Вы можете легко проверить экспериментально, написав несложный программный текст.
2) Класс Random:
Умение генерировать случайные числа требуется во многих приложениях. Класс Random содержит все необходимые для этого средства. Класс Random имеет конструктор класса: для того, чтобы вызы-вать методы класса, нужно вначале создавать экземпляр (объект) класса. Созданный объект обеспечи-вает получение псевдослучайных (почти случайных…) чисел. Этим Random отличается от класса Math, у которого все поля и методы – статические, что позволяет обойтись без создания экземпляров класса Math.
Как всякий "настоящий" класс, класс Random является наследником класса Object, а, следовательно, имеет в своём составе и методы родителя. Рассмотрим часть оригинальных методов класса Random, используемых для генерирования последовательностей случайных чисел.
Начнём рассмотрение с конструктора класса. Конструктор обеспечивает создание объектов класса. Он имеет две реализации. Одна из них позволяет генерировать неповторяющиеся при каждом запуске серии случайных чисел. Начальный элемент такой серии строится на основе текущей даты и времени, что гарантирует уникальность серии. Этот конструктор вызывается без параметров. Он описан как Random(). Другой конструктор с параметром целого типа – Random(int) обеспечивает важную возмож-ность генерирования повторяющейся серии случайных чисел. Параметр конструктора используется для построения начального элемента серии, поэтому при задании одного и того же значения параметра се-рия будет повторяться.
Перегруженный метод Next() при каждом вызове возвращает положительное целое, равномерно рас-пределённое в некотором диапазоне. Диапазон задаётся параметрами метода. Три реализации метода отличаются набором параметров:
- Next () – метод без параметров выдаёт целые положительные числа во всём положительном диапазоне типа int;
- Next (max) – выдаёт целые положительные числа в диапазоне [0, max];
- Next (min, max) – выдаёт целые положительные числа в диапазоне [min, max].
Метод NextDouble() имеет одну реализацию. При каждом вызове этого метода выдаётся новое слу-чайное число, равномерно распределённое в интервале [0, 1].
Ещё один полезный метод класса Random позволяет при одном обращении получать целую серию случайных чисел. Метод имеет параметр – массив, который и будет заполнен случайными числами.
Метод описан как NextBytes(buffer). Так как параметр buffer представляет массив байтов, то, естест-венно, генерированные случайные числа находятся в диапазоне [0, 255].
Рассмотрим пример работы со случайными числами:
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]);
}
Краткий комментарий к тексту программы. Сначала создаются два объекта класса Random. У этих объектов разные конструкторы. Объект с именем realRnd позволяет генерировать неповторяющиеся серии случайных чисел. Объект repeatRnd даёт возможность повторить при необходимости серию. Ме-тод NextDouble создаёт серию случайных чисел в диапазоне [0, 1). Вызываемый в цикле метод Next с двумя параметрами создаёт серию случайных отрицательных целых, равномерно распределённых в диапазоне [-100, -10]. Метод NextBytes объекта repeatRnd позволяет получить при одном вызове массив случайных чисел из диапазона [0, 255]. Результаты вывода можно увидеть на рисунке ниже.
