投稿日 | : 2006/02/18(Sat) 19:26 |
投稿者 | : おじん |
Eメール | : |
URL | : |
タイトル | : 乱数について |
場違いの質問かもしれませんがVBを使っているということで、、、
乱数発生で「正規分布」する数値を作ろうとしました。
数学の本を読んでいて「一様乱数の平均は正規分布になる」という
説明があり、下記のコードでテストをしてみましたが、見た目では
正規分布のようですが、19から51の範囲で指定したはずなのに
両端近辺の値が発生しないのです。何故なのかわかりません。
NomalRND(乱数発生)かCommand1(テスト)かのどちらかに間違いが
あるのですが。
'------------------------------------------------
Private Sub Command1_Click()
Dim dat(), out%(99), n%, w!
dat = NormalRND(19, 51, 400) 'この400を変えたら
For n = 0 To 399 'ここも変える
w = dat(n): out(w) = out(w) + 1
Next n
Me.Cls
For n = 18 To 55
Me.Print n, String(out(n), "-")
Next n
End Sub
'------------------------------------------------
' 正規乱数の発生
Private Function NormalRND( _
ByVal low As Long, _
ByVal up As Long, _
ByVal m_max As Long) As Variant
'
' low から up の間の数を m_max 個発生
'
Dim r&, n&, m&, t(), x&
Const n_cnt = 10 '一様乱数発生回数
' 数値を大にするを分布が狭まる
Randomize
ReDim t(m_max - 1) '正規乱数の回数
Do Until n >= m_max - 1
x = 0
' 一様乱数の平均は正規分布になる
For m = 1 To n_cnt
r = Int((up - low + 1) * Rnd + low)
x = x + r
Next m
x = Int(x / n_cnt) '平均をカウント
t(n) = x
n = n + 1
DoEvents
Loop
NormalRND = t() '正規乱数出力
End Function
'------------------------------------------------