Другие распределения случайных чисел
Другие распределения случайных чисел
Если случайные числа используются для моделирования некоторого процесса, то вы можете обнаружить, что все рассмотренные выше генераторы случайных чисел не позволяют решить поставленную задачу. Это вызвано равномерным распределением генерируемых ими случайных чисел, т.е. вероятность возникновения одного случайного числа равна вероятности возникновения любого другого числа. При проведении моделирования бывают необходимы случайные числа, распределенные не по равномерному закону. Тем не менее, для вычисления последовательностей с другими распределениями можно использовать уже изученные нами генераторы случайных чисел.
Вторым по значимости после равномерного является нормальное или гауссово распределение. Оно также известно под названием распределение колокообразной формы, поскольку все точки данных расположены симметрично относительно среднего значения, причем, чем дальше точка от среднего значения, тем меньше вероятность ее получения. Нормальное распределение играет очень важную роль в статистике, где оно используется практически повсеместно. Например, рост людей 42-летнего возраста распределен в соответствии с нормальным распределением. Если попросить измерить длину стола нескольких человек с помощью линейки, длина которой намного короче, чем длина стола (другими словами, в случае существования элемента ошибки), полученный ответ будет соответствовать закону нормального распределения. И подобных примеров можно привести очень много.
Для нормально распределенного набора случайных чисел необходимо знать среднее значение и среднеквадратическое отклонение. Если эти параметры известны, генерация последовательности случайных чисел не представит особого труда. Для генерации мы будем использовать преобразование Бокса-Мюллера. Сами математические выкладки в этой книге не приводятся. Преобразование на своем входе требует два равномерно распределенных случайных числа, а на выходе генерирует два нормально распределенных случайных числа. Это не совсем удобно, поскольку нам, как правило, нужно только одно число за один раз. Однако второе число можно записать и выдать в качестве выходного значения при следующем вызове функции. Обратите внимание, что для многопоточных приложений предложенное решение приведет к тому, что функция не будет независимой от потоков, поскольку неиспользуемое значение придется хранить в глобальной переменной. Указанного недостатка можно избежать, если инкапсулировать вычисление случайных чисел в классе.
Обратите внимание, что мы исключаем тот редкий случай, когда оба равномерно распределенных случайных числа равны 0, и сумма их квадратов также равна 0, поскольку от этого значения в дальнейшем мы берем логарифм, который для 0 дает бесконечность. Поэтому подобной ситуации следует избегать.
Листинг 6.12. Случайные числа с нормальным распределением
var
NRGNextNumber : double;
NRGNextlsSet : boolean;
function NormalRandomNumber(aPRNG : TtdBasePRNG;
aMean : double;
aStdDev : double): double;
var
Rl, R2 : double;
RadiusSqrd : double;
Factor : double;
begin
if NRGNextlsSet then begin
Result := NRGNextNumber;
NRGNextlsSet := false;
end
else begin
{получить два числа, которые определяют точку внутри окружности единичного радиуса}
repeat
Rl := (2.0 * aPRNG.AsDouble) -1.0;
R2 := (2.0 * aPRNG.AsDouble) - 1.0;
RadiusSqrd := sqr(Rl) + sqr(R2);
until (RadiusSqrd < 1.0) and (RadiusSqrd > 0.0);
{применить преобразование Бокса-Мюллера}
Factor := sqrt(-2.0 * In(RadiusSqrd) / RadiusSqrd);
Result := Rl * Factor;
NRGNextNumber :=R2 * Factor;
NRGNextlsSet :=true;
end;
Result := (Result * aStdDev) + aMean;
end;
Еще одним важным распределением является экспоненциальное. Случайные числа, распределенные по этому закону, используются для моделирования ситуаций "времени прибытия", например, времени прибытия покупателей к кассе в супермаркете. Если в среднем покупатели подходят к кассе каждые x секунд, то время прибытия будет распределено по экспоненциальному закону со средним значением х.
Генерировать случайные числа, распределенные по экспоненциальному закону, достаточно просто. Не вдаваясь в математические подробности можно сказать, что если u - случайное число, распределенное по равномерному закону в диапазоне от 0.0 до 1.0, то e, которое равно
e = -x ln(u)
будет случайном числом, распределенным по экспоненциальному закону со средним значением х.
Листинг 6.13. Случайные числа, распределенные по экспоненциальному закону
function ExponentialRandomNumber( aPRNG : TtdBasePRNG;
aMeart : double): double;
var
R : double;
begin
repeat
R := aPRNG.AsDouble;
until (R <> );
Result := -aMean * ln(R);
end;
И снова обратите внимание, что исключается редкий случай, когда значение равномерно распределенного случайного числа равно 0, поскольку от него будет браться натуральный логарифм.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
3.2.1.7. Использование персональных программ распределения
3.2.1.7. Использование персональных программ распределения Набор функций с malloc() является набором общего назначения по выделению памяти. Он должен быть способен обработать запросы на произвольно большие или маленькие размеры памяти и осуществлять все необходимые учетные
Приложение Б Генератор случайных чисел ядра
Приложение Б Генератор случайных чисел ядра В ядре Linux реализован генератор случайных чисел, который теоретически может генерировать истинно случайные числа. Генератор случайных чисел собирает в пул энтропии шумы внешней среды, которые поступают из драйверов
5.28. Генерирование случайных чисел
5.28. Генерирование случайных чисел Если вас устраивают псевдослучайные числа, вам повезло. Именно они предоставляются в большинстве языков, включая и Ruby.Метод rand из модуля Kernel возвращает псевдослучайное число x с плавающей точкой, отвечающее условиям x >= 0.0 и x < 1.0.
11.6. Генерация случайных чисел
11.6. Генерация случайных чисел ПроблемаТребуется сгенерировать несколько случайных чисел в формате с плавающей точкой в интервале значений [0.0, 1.0) при равномерном их распределении.РешениеСтандарт C++ предусматривает наличие C-функции библиотеки этапа исполнения rand,
6.5.4. Устройства генерирования случайных чисел
6.5.4. Устройства генерирования случайных чисел Специальные устройства /dev/random и /dev/urandom предоставляют доступ к средствам генерирования случайных чисел, встроенным в ядро Linux.Большинство аналогичных программных функций, например функция rand() стандартной библиотеки языка С,
Генерация случайных чисел
Генерация случайных чисел Прежде всего, давайте опишем, что мы понимаем под случайным числом (random number). Без четкого определения термина мы будем неуверенно себя чувствовать при разработке и реализации генератора случайных чисел.Будет ли число 2 случайным числом? Просто
Выводы по алгоритмам генерации случайных чисел
Выводы по алгоритмам генерации случайных чисел В предыдущем разделе были рассмотрены несколько достаточно простых генераторов случайных чисел. Наилучшие последовательности чисел позволяют получить два последних генератора, но, к сожалению, они выдвигают жесткие
Пример 9-23. Генерация случайных чисел
Пример 9-23. Генерация случайных чисел #!/bin/bash# $RANDOM возвращает различные случайные числа при каждом обращении к ней.# Диапазон изменения: 0 - 32767 (16-битовое целое со знаком).MAXCOUNT=10count=1echoecho "$MAXCOUNT случайных чисел:"echo "-----------------"while [ "$count" -le $MAXCOUNT ] # Генерация 10 ($MAXCOUNT) случайных
О случайных числах и сеансовых ключах
О случайных числах и сеансовых ключах Для генерации одноразовых симметричных сеансовых ключей PGP использует криптографически стойкий генератор псевдослучайных чисел (ГПСЧ)[11]. Если файл ПСЧ отсутствует, он автоматически создаётся и заполняется абсолютно произвольными
НОВОСТИ: Цепь случайных совпадений?
НОВОСТИ: Цепь случайных совпадений? Автор: Киви БердРазразившийся в Греции скандал вокруг перехвата сотовой связи ключевых политических фигур страны по своим масштабам, пожалуй, не знает себе равных не только в Европе, но и во всем мире. Вкратце суть произошедшего
У11.9 Генерация случайных чисел
У11.9 Генерация случайных чисел Напишите класс, реализующий алгоритм получения псевдослучайных чисел, основанный на последовательности: ni = f(ni - 1), где функция f задана, а начальное значение n0 определяется клиентом класса. Функция не должна иметь побочных эффектов.
Антон Войтишек (ИВМиМГ СО РАН) о случайных и псевдослучайных числах Алла Аршинова
Антон Войтишек (ИВМиМГ СО РАН) о случайных и псевдослучайных числах Алла Аршинова Опубликовано 08 ноября 2010 года В криптографии секретные коды представляют собой хаотические наборы (последовательности) нулей и единиц (это соответствует двоичному
Обработка чисел
Обработка чисел Так как программа Excel предназначена для обработки чисел, важную роль играет правильная настройка их формата. Для человека число 10 – это просто единица и ноль. С точки зрения Excel эти две цифры могут нести совершенно разную информацию в зависимости от того,
СЕЛО ЩЕПЕТНЕВКА: Кривая распределения
СЕЛО ЩЕПЕТНЕВКА: Кривая распределения Автор: Василий ЩепетневНаличие людей, разумом не богатых, является фактом установленным. То тут то там появляются статьи, в которых сообщается: третья часть населения страдает олигофренией в стадии умеренной дебильности.