Лабораторная работа №10. Генерация равномерных и неравномерных распределений случайных чисел
Использование гистограмм для отображения характера распределения случайной величины
Пусть имеется генератор случайных чисел в диапазоне от a до b. Для простоты пусть это будет генератор равномерно распределенных числовых значений. Такое распределение можно получить, например, следующей языковой конструкцией VFP:
x = a + (b-a)*rand().
Гистограмма представляет собой множество узких, одинаковой ширины и равноудаленных друг от друга, вертикальных прямоугольников. Количество прямоугольников гистограммы соответствует количеству отрезков, на которые разбивается отрезок (a,b), высота прямоугольников соответствует количеству случайных значений попавших в данный отрезок.
Алгоритм построения гистограммы на естественном языке:
A = левая граница
B = правая граница
N = кол-во разбиений
M = кол-во испытаний
Массив AN(N)
** AN(i) элемент массива – соответствует количеству попаданий в i-ый элементарный
** отрезок
H = (B-A)/N && ширина элементарного отрезка
Цикл по L от 1 до N
AN(L)=0
Конец Цикла
Цикл по k от 1 до M && цикл ипытаний
X = ГенераторСлучайнойВеличины(a,b)
Цикл по L от 1 до N
LB = A + (L-1)*H && левая граница элементарного отрезка
RB = LB + H
Если x>=LB и x< RB тогда
AN(L) = AN(L) + 1
Выход из цикла
Конец Если
Конец Цикла
Конец Цикла
Цикл по L от 1 до N
ОтрисовкаСтолбца(L, AN(L))
Конец Цикла
Функция ГенераторСлучайнойВеличины
Параметры a,b
Возврат a + (b-a)*rand()
* Здесь rand() – системная функция возвращающая
* равномерно-распределенное случайное число от 0 до 1.
Конец Функции
Функция ОтрисовкаСтолбца
Параметры NS, HS
** NS – номер столбца
** HS – высота столбца
** ЛевоеПоле = значение левого поля в точках
** ШиринаСтолбца = Значение ширины столбца в точках
** Зазор = Значение зазора между столбцами в точках
x1= ЛевоеПоле + (ШиринаСтолбца + Зазор) * (NS-1)
** вычисляем левую границу столбца NS
x2 = x1 + ШиринаСтолбца
Отрисовка столбца номер NS и высоты HS
Конец Функции
Приведенный алгоритм построения гистограммы можно оптимизировать. Вместо цикла:
X = ГенераторСлучайнойВеличины(a,b)
Цикл по L от 1 до N
LB = A + (L-1)*H && левая граница элементарного отрезка
RB = LB + H
Если x>=LB и x< RB тогда
AN(L) = AN(L) + 1
Выход из цикла
Конец Если
Конец Цикла
в котором определяется номер диапазона можно использовать более простой способ: L = ОкруглитьВверх((x-A)/h)
Для построения гистограммы из N столбцов по результатам M испытаний генератора случайных чисел в диапазоне от A до B можно использовать следующий фрагмент программы на VFP:
h=(B-A)/N
For k = 1 to M && цикл ипытаний
X = ГенераторСлучайнойВеличины()
L=ceiling((x-a)/h)
IF L>=1 AND L<=N
AN(L)=AN(L)+1
ELSE
IF L=0
AN(1)=AN(1)+1
ELSE
? x,L
ENDIF
ENDIF
EndFor
Генератор дискретно-распределенных значений
Построим генератор дискретных случайных величин с заданными вероятностями на основе системного генератора равномерно-распределенной величины от 0 до 1: Пусть величина xi может принимать N-значений с вероятностями pi:
Xi | Pi |
0.1 | |
0.2 | |
0.3 | |
0.1 | |
0.2 | |
0.1 |
Алгоритм основывается на свойстве равномерного распределения равномерно заполнять отрезок от 0 до 1, причем вероятность попадания случайного значения в подинтервал отрезка (0,1) шириной D равна ширине этого подинтервала. Например, если отрезок (0,1) разбить на два подинтервала (0,0.2) и (0.2, 1), то вероятность попадания в подинтервал (0? 0.2) будет равна 0.2, а вероятность попадания в отрезок (0.2, 1) будет равна 0.8. Таким образом, для вышеприведенной таблицы необходимо разбить отрезок (0,1) на 6 подинтервалов.
Xi | Pi | Wi Ширина | LBi Левая граница | RBi Правая граница |
0.1 | 0.1 | 0.1 | ||
0.2 | 0.2 | 0.1 | 0.3 | |
0.3 | 0.3 | 0.3 | 0.6 | |
0.1 | 0.1 | 0.6 | 0.7 | |
0.2 | 0.2 | 0.7 | 0.9 | |
0.1 | 0.1 | 0.9 |
LB(1)=0, RB(1) = LB(1) + P(1)
Остальные элементы массивов левых и правых границ можно вычислить в цикле
Цикл по I от 2 до N
LB(i) = LB(i-1) + W(i-1)
RB(i) = LB(i) + P(i)
Конец Цикла
Первый вариант алгоритма
Функция ГенераторДискретныхЗначений
N=6
Массив P(N), LB(N), RB(N),W(N)
СчитываемМассив(@P,N)
LB(1)=0
RB(1) = LB(1) + P(1)
Цикл по I от 2 до N
LB(i) = LB(i-1) + W(i-1)
RB(i) = LB(i) + P(i)
Конец Цикла
XR = rand()
LB = 0
Если XR>=LB(1) и XR<RB(1)
Возврат X(1)
ИначеЕсли XR >=LB(2) и XR <RB(2)
Возврат X(2)
ИначеЕсли XR >=LB(3) и XR <RB(3)
Возврат X(3)
ИначеЕсли XR >=LB(4) и XR <RB(4)
Возврат X(4)
ИначеЕсли XR >=LB(5) и XR <RB(5)
Возврат X(5)
ИначеЕсли XR >=LB(6) и XR <=RB(6)
Возврат X(6)
Конец Если
Конец Функции
Функция ГенераторДискретныхЗначений
N=6
Массив P(N), X(N)
XR = rand()
LB = 0
Цикл по i=1 до N
Если xr>=LB и xr<LB+P(i)
Возврат X(i)
Конец Если
LB = LB + P(i)
Конец Если
Возврат 0
Конец Функции