正規分布の乱数

1,413 views

正規分布をする乱数を生成させる方法です。
Excelのワークシート関数NORM.S.INVをVBA内で呼び出して戻り値に対して正規化処理を行なうと、正規分布乱数を作り出すことができます。

 

'--------------------------------------------------------------------
' モンテカルロ計算
' 引数 f:0 = 一様乱数、1 = 正規乱数
'--------------------------------------------------------------------
Public Sub monte(ByVal f As Integer)
    Dim i As Long, j As Long
    Dim ct As Long
    Dim sn As Long
    Dim n As Double, r As Double
    Dim a() As Double, ak() As Double
    Dim sd As Double
    Dim l_lim As Double, u_lim As Double

    ' ±3σの限界確率値取得
    l_lim = WorksheetFunction.Norm_S_Dist(-3, True)
    u_lim = WorksheetFunction.Norm_S_Dist(3, True)

    sn = 10000 ' モンテカルロ計算サンプル数
    ct = 5 ' 要因数
    ReDim a(sn), ak(ct)
    ' 公差値取得
    For i = 0 To ct - 1
        ak(i) = Range("A2").Offset(i, 0).Value
    Next i

    Randomize
    For j = 0 To (sn - 1)
        n = 0
        ' 1サンプルの計算
        For i = 0 To (ct - 1)
            ' 使用フラグが立っている項目に対して計算
            r = Rnd
            If f = 1 Then ' 正規乱数
                ' ±3σ以内となる乱数のみ処理
                If (r > l_lim And r < u_lim) Then
                    ' 3(σ)を加算後1/6して0~1に標準化
                    r = (WorksheetFunction.Norm_S_Inv(r) + 3) / 6
                Else
                    j = j - 1 ' ループカウンタを戻す
                    GoTo SKIP ' 当該試行をスキップする
                End If
            End If
            ' 公差の幅で計算するため片側公差を2倍する
            n = n + 2 * ak(i) * r
        Next i
        ' 1サンプルの合計公差を順次配列に格納
        a(j) = n
SKIP:
    Next j

    ' 標準偏差(ワークシート関数利用)
    sd = WorksheetFunction.StDev_S(a)
    ' 3σ値
    Range(CELL_MONTE1).Offset(f, 0).Value = sd * 3
End Sub

キーワード
正規分布乱数,Excel,VBA,マクロ,モンテカルロ,3σ,Cp,正規化,NORM.S.INV,確率変数,確率,ボックス・ミュラー