Лабораторная работа №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

Конец Функции

Наши рекомендации