VB6.0用掲示板の過去のログ(No.2)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [管理用]

投稿日: 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
'------------------------------------------------


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- VBレスキュー(花ちゃん) - - Web Forum -