zoukankan      html  css  js  c++  java
  • 如何模拟高斯分布的随机数发生器?

    在一些算法中,经常会用到随机数,最常用的随机数有两种,一是服从均匀分布的随机数,二是服从高斯分布(正态分布)的随机数。在标准C中并没有产生高斯分布的随机数发生器,只有服从均匀分布的随机数发生器rand(),那么如何通过rand()来模拟出高斯分布特征的伪随机数呢?这就是本文的话题。


    实验原理:高斯分布的随机数在概率上服从高斯分布,如果通过rand()产生某个区间的随机数,通过高斯分布的概率计算公式得到该随机数对应的概率值,然后与一个随机概率进行比较,如果该概率值大于随机概率,就认为该随机数是服从高斯分布的随机数。


    高斯分布随机数的参数:随机数的区间为[f_floor,f_ceil],mu为均值,sigma为std标准差


    废话少说,直接上代码,基于Matlab进行的仿真实验:

    %% 产生指定区间上服从正态分布的随机数
    %% [f_floor,f_ceil],mu为均值,sigma为std标准差
    %% 生成原理:用均匀rand生成该区间的x,然后计算对应的高斯概率,
    %% 与随机概率比较,如果大于随机概率,则挑出来作为一个值
    %% 
    %digits(50)%设定数字精度
    f_floor = -10.0;
    f_ceil = 10.0;
    mu = 5;
    sigma = 1;
    N = 100000;
    X = zeros(1,100);
    for n = 1:N
    prob = 0;
    y = rand();
    while prob < y;
        x = f_floor + (f_ceil - f_floor) * rand();
        prob = 1/sqrt(2*pi*sigma*sigma)*exp(-(x-mu)^2/sigma/sigma/2);
        y = rand();
    end;
    X(n) = x;
    end;
    plot(X);
    hist(X,50)
    实验结果如图所示:


    实验结果分析:

    通过统计直方图可以看出,通过这种机制生成的随机数大致满足区间为[f_floor,f_ceil],mu为均值,sigma为std标准差的高斯分布随机数。也就证明了算法的正确性。


    高斯分布的随机数或者高斯噪声在现代数字信号处理中常常用到,而在一些开发平台并没有提供可以直接调用的高斯随机数发生器,因此就需要模拟出高斯随机数,而本文可以作为参照进行。


    *************************************************************************************************************************************
    2015-7-21





  • 相关阅读:
    .Net中集合排序还可以这么玩
    C# 6.0中你不知道的新特性
    EF Core利用Transaction对数据进行回滚保护
    dot watch+vs code提升asp.net core开发效率
    .Net小白的大学四年,内含面经
    EF Core利用Scaffold从根据数据库生成代码
    利用EF Core的Join进行多表查询
    EF Core下利用Mysql进行数据存储在并发访问下的数据同步问题
    新建.Net Core应用程序后引用项一直黄色感叹号怎么办?
    用户密码传输和存储的保护
  • 原文地址:https://www.cnblogs.com/huty/p/8519310.html
Copyright © 2011-2022 走看看