На днях пришлось писать программу, которая генерировала бы случайные числа
распределенные по нормальному закону.
Писать самому не очень хотелось, и я нашел на богом забытом сайте следующий юнит
для Delphi: TfrGenerator.
Этот unit в общем случае генерировал случайные числа подчиненные любому
закону распределения, но мне нужна была именно стандартная его сборка с
нормальным законом. Комментарий автора к компоненту:
========================
Version 2.0, 12.07.2005
Класс TfrGenerator - модифицированный генератор случайных чисел;
генерирует случайную величину, подчиняющуюся заданному (в виде f(x)) закону
распределения.
По определению плотности вероятности требуется, чтобы
1) f(x)>=0 в интервале [xMinCellBound..xMaxCellBound];
2) xMinCellBound <= xMaxCellBound
Использование:
Особенность алгоритма (
http://ps300.narod.ru/fr3d/prob.htm ) требует,
чтобы f(x) была ограниченной на интересующем нас интервале.
Т.е. в виде f(x) невозможно подать функцию 1/sqrt(x) на интервале [0..1]
(несмотря
на то, что интеграл от нее на этом интервале конечен и ничто ей не мешает
выступать
в роли закона распределения)
Нормированность от f(x) не требуется, она обеспечивается автоматически (т.е.
использование
f(x) и Const*f(x) даст один и тот же результат)
В случае, если используемая f(x) на интересующем нас интервале не является
унимодальной (унимодальность - это когда только один максимум), следует вместо
GetMaxValueOfFunction использовать другую функцию!
Используемый алгоритм без труда может быть обобщен на функции нескольких
переменных, напрмер, f(x,y) или f(x,y,z)
Отличие от версии 1.0: функция, задающая плотность вероятности, вынесена в
отдельный класс, что позволило иметь одновременно несколько объектов
класса TfrGenerator, выдающих случайную величину по одному и тому же закону
(например, нормальному), но с разными параметрами (например, дисперсией и
средним арифметическим)
Домашняя страница с подробным описанием алгоритма:
http://ps300.narod.ru/fr3d/prob.htm
Copyright (C) 1996,2004,2005 Сергей Пашков s300[собака]ngs.ru ICQ 117631343
Юзайте на здоровье!
========================
Поскольку такой полезный труд может потеряться в пределах сети решил
перевыложить его.
|