谁能提供0-1(不包含0和1)的符合正态分布的随机数算法?

解决方案 »

  1.   

        Dim S As Single
        Randomize (Timer)
        S = Rnd
        Print S
      

  2.   

    自己写了个另类随机方法,效率比自带的rnd好新建一个工程,建一个窗口,再建一个command1,双击窗口加入以下代码:
    Private Declare Function GetTickCount Lib "kernel32" () As LongDim g_seed As Long     '种子
    Const m  As Long = 2147483399
    Const a As Long = 40692
    Const q As Long = m / a
    Const r As Long = m Mod aFunction Random_Seed(seed As Long) '初始化种子,若seed为0则使用系统时间为种子
        If seed = 0 Then g_seed = GetTickCount() Else g_seed = seed
    End FunctionFunction Random_Rand() As Long     ' 取得0-2147483399随机整数
        g_seed = a * (g_seed Mod q) - r * (g_seed / q)
        If g_seed < 0 Then g_seed = g_seed + m
        Random_Rand = g_seed
    End FunctionFunction Random_Int(min As Long, max As Long) As Long      ' 取得指定范围随机整数
        Random_Int = (max - min + 1) * (Random_Rand / 2147483399) + min
    End FunctionFunction Random_Single(min As Single, max As Single) As Single       ' 取得指定范围随机数
        Random_Single = (max - min + 1) * (Random_Rand / 2147483399) + min
    End FunctionPrivate Sub Form_Load()
        Random_Seed 0 '初始化种子,一定要哦!
    End Sub'下面是测试
    Private Sub Command1_Click()
        For i = 0 To 100
            Debug.Print "随机5-20内的整数: "; Random_Int(5, 20); "随机5-20内的数: "; Random_Single(5, 20)
        Next
    End Sub
      

  3.   

    vb自带的函数rnd()就是符合正态分布的。
      

  4.   

    直接用函数rnd(),加个IF语句如果是0则剔除。这样不行吗?
      

  5.   

    如果是Excel中用倒是可以用Excel的相关公式生成。要自己搞一个恐怕就麻烦了。
      

  6.   

    标准库的rand函数使用线性同余算法,其生成的随机数是符合均匀分布,而不是正态分布的。http://blog.csdn.net/newsuppy/archive/2004/09/15/104848.aspx参考这个人的博客,你面有讲大部分随机数的方法在Blitz++中随机数类组织在ranlib namespace中,使用方法也非常简单,seed成员函数种入种子后,再用random成员函数就可以了。Blitz++中包括了产生各种概率分布情况的随机数,列举如下:均匀分布(Uniform),正态分布(Normal),指数分布(Exponential),Beta分布,Gamma分布,Χ方分布,F分布,离散均匀分布。具体地可以参考Blitz++文档的第九章。本文将会演示正态分布的随机数类。
      

  7.   


    '正态分布随机数,参数是均值和标准差
    Public Function RndNormal(sngMean As Single, sngStdDev As Single) As Single
    RndNormal = sngMean + (sngStdDev * (Sqr(-2 * Log(Rnd)) * Cos(6.28 * Rnd)))
    End Function