カテゴリ
以前の記事
2024年 03月 2024年 02月 2024年 01月 2023年 12月 2023年 11月 2023年 10月 2023年 09月 2023年 08月 2023年 07月 2023年 06月 more... お気に入りブログ
最新のコメント
検索
タグ
最新の記事
記事ランキング
ブログジャンル
画像一覧
|
2006年 11月 24日
業務でよく利用する確率分布に従った乱数発生方法です.なお,VBのRnd()関数の周期は2の24乗(16,777,216)ですので,不足する場合は他の乱数発生アルゴリズム,たとえばMersenne Twister法(周期:2の19,937乗-1)などを用いる必要があります.
気が向いたらクリック!
'円周率 Const PI As Double = 3.14159265358979 '正規乱数の発生(ボックスミュラー法) Public Function NormalRandom(ByVal Mean As Double, ByVal SD As Double) As Double 'Mean:平均値,SD:標準偏差 Dim logMean As Double, logSD As Double Static t As Double, u As Double '一度に2つの乱数を取得するため,swith変数で取得を制御する If Not switch Then switch = True t = Math.Sqr(-2 * Math.Log(1 - Rnd)) u = 2 * PI * Rnd Return SD * (t * Math.Cos(u)) + Mean Else switch = False Return SD * (t * Math.Sin(u)) + Mean End If End Function '対数正規乱数の発生(ボックスミュラー法) Public Function LogNormalRandom(ByVal Mean As Double, ByVal SD As Double) As Double 'Mean:平均値,SD:標準偏差 Dim logMean As Double, logSD As Double '一度に2つの乱数を取得するため,swith変数で取得を制御する Static t As Double, u As Double 'ζ logSD = Math.Sqr(Math.Log(1 + (SD / Mean) ^ 2)) 'λ logMean = Math.Log(Mean) - Math.Log(1 + (SD / Mean) ^ 2) / 2 '一度に2つの乱数を取得するため,swith変数で取得を制御する If Not switch Then switch = True t = Math.Sqr(-2 * Math.Log(1 - Rnd)) u = 2 * PI * Rnd Return Math.Exp(logSD * (t * Math.Cos(u)) + logMean) Else switch = False Return Math.Exp(logSD * (t * Math.Sin(u)) + logMean) End If End Function 'ポアソン乱数の発生 Public Function PoissonRandom(ByVal Lambda As Double) As Long 'Lambda:平均値 Dim k As Integer Dim am As Double am = Math.Exp(Lambda) * Math.Rnd k = 0 Do While 1 < am am = am * Math.Rnd k = k + 1 Loop Return k End Function '指数乱数の発生 Public Function ExponentialRandom(ByVal Theta As Double) As Double 'Theta:指数定数 Return -Log(1 - Rnd) * Theta End Function 'ワイブル乱数の発生 Public Function WeibullRandom(ByVal Theta As Double, ByVal p As Double) As Double 'Theta:尺度係数 , p:形状係数 'p<1:初期故障型,p=1:偶発故障型.p>1:摩耗故障型 Return (Theta) * ((-(Math.Log(1 - Math.Rnd))) ^ (1 / p)) End Function '一様乱数の発生 Public Function UniformRandom(Optional ByVal Lower As Double = 0, Optional ByVal Upper As Double = 1) As Double Return (Upper - Lower) * Math.Rnd + Lower End Function 'ベータ乱数の発生(ガンマ乱数を使用) Public Function BetaRandom(ByVal q As Double, ByVal R As Double, Optional ByVal Lower As Double = 0, Optional ByVal Upper As Double = 1) As Double Dim temp As Double temp = GammaRandomMT(q) Return (Upper - Lower) * (temp / (temp + GammaRandom(R))) + Lower End Function 'ベータ乱数の発生(ガンマ乱数を不使用) Public Function BetaRandomNotGamma(ByVal q As Double, ByVal R As Double, Optional ByVal Lower As Double = 0, Optional ByVal Upper As Double = 1) As Double Dim X As Double, y As Double Do X = Rnd ^ (1 / q) y = Rnd ^ (1 / R) Loop While 1 < X + y Return (Upper - Lower) * (X / (X + y)) + Lower End Function 'ガンマ乱数の発生 Public Function GammaRandom(ByVal a As Double) As Double Dim t As Double, u As Double, X As Double, y As Double If a > 1 Then t = Math.Sqr(2 * a - 1) Do Do Do X = 1 - Rnd y = 2 * Rnd - 1 Loop While X * X + y * y > 1 y = y / X X = t * y + a - 1 Loop While X <= 0 u = (a - 1) * Math.Log(X / (a - 1)) - t * y Loop While u < -50 Or Rnd > (1 + y * y) * Math.Exp(u) Else t = E / (a + E) Do If Rnd < t Then X = Rnd ^ (1 / a) y = Math.Exp(-X) Else X = 1 - Math.Log(Rnd) y = X ^ (a - 1) End If Loop While Rnd >= y End If Return X End Function
by dolphinicity
| 2006-11-24 14:02
| GIS
|
Comments(0)
|
ファン申請 |
||