Функция на VBA, возвращающая случайную величину по нормальному распределению
Формулировка задачи:
Посоветуйте способ преобразования равномерно распределённой случайной величины (стандартная функция Rnd в VBA) в случайную величину по нормальному распределению на VBA.
Вообще говоря, мне нужно, чтобы возвращаемое значение было в виде double в заданном диапазоне, в котором оно варьируется по нормальному распределению (мат. ожидание - середина отрезка, дисперсию задаём).
При этом важно, чтобы функция работала очень быстро, но допускается неточность в строгом соблюдении нормального распределения, важна лишь суть (чтобы крайние значения появлялись редко, а центровые - часто).
Решение задачи: «Функция на VBA, возвращающая случайную величину по нормальному распределению»
textual
Листинг программы
Option Explicit
Const e = 2.71828459045235
Const pi = 3.1415926535898
Const t = vbTab & vbTab, pp = vbCr & vbCr ' табуляторы и абзацы (для вывода)
Sub tipa_gauss()
Dim i As Long, N As Long, opyt(1 To 20) As Double, vyvod As String
Randomize
'Бросим для примера 20 случайных точек:
For i = 1 To 20
opyt(i) = 2 * Rnd - 1 'МО этого (равномерного) распределения равно 0
vyvod = vyvod & _
Format(i, "00") & t & _
Round(opyt(i), 3) & t & Round(NORM(opyt(i)), 3) & vbCr 'таблица
Next
If MsgBox("№ опыта" & vbTab & "Bыпало (x)" & vbTab & "NORM(x)" & pp & vyvod, _
vbOKCancel) = vbCancel Then Exit Sub Else tipa_gauss
End Sub
Function NORM(x)
Const sigma = .1 'среднее квадратическое отклонение (CKO)
Const mu = 0 'матожидание (MO)
Dim coef As Double
coef = 1 / sigma / Sqr(2 * pi)
NORM = coef * e ^ (-(x - mu) ^ 2 / 2 / sigma / sigma)
End Function