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