среда, 1 августа 2012 г.

Случайные числа в VC++

Часто в задачах определенного типа требуется строить последовательности чисел лежащие в заданных границах и удовлетворяющие условиям равномерного распределения. Перед практической частью изложения материала неплохо бы освежить в памяти теоретические аспекты случайных чисел. Для этого вполне достаточным на мой взгляд будет переход по ссылке Генераторы случайных чисел...

Поставим себе простейшую задачу - взять случайное вещественное число из отрезка [0..1]. Решив ее и повторив N раз мы можем сформировать последовательность случайных чисел, которая имеет более практическое применение. Итак приступим...

Во-первых определимся с инструментальной базой наших будущих решений. Платформа .NET Framework предлагает для этого класс Random из пространства имен System. Во-вторых отметим для себя, что Random представляет генератор псевдослучайных чисел с равномерным распределением. Генерируемые им числа не являются полностью не зависимыми друг от друга, и следовательно можно ожидать появления внутри последовательности повторяющихся групп чисел, что конечно снижает ценность псевдогенератора.

У класса Random есть функция NextDouble() возвращающая случайное double число из промежутка [0..1), причем результат больше или равен нулю, но строго меньше единицы. Наша задача решается тремя строчками кода:

double eRandom(int sleep)
{
   //Thread::Sleep(sleep);
   Random^ rnd = gcnew Random;
   return rnd->NextDouble();
}

Если eRandom в цикле из N итераций генерирует повторяющиеся группы чисел, раскомментируйте первую строчку кода функции и подберите задержку sleep при которой группы исчезнут. Общее правило таково, что чем больше задержка, тем меньше повторяющихся чисел, но тем продолжительнее время выполнения цикла. Думаю для небольших задач данный генератор вполне сгодится.