Функция на 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д