Функция на 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.923 из 5
Похожие ответы