任意分布的随机数的产生方法—VC程序实现方法

作者:xiaoli  日期:2006-5-29 21:34:14  来源:中国教程网  点击:次  评论

   調用方法是srand(GetTickCount()),但是又不能在每次調用rand()的時候都用srand(GetTickCount())來初始化,因為現在計算機運行時間比較快,當連續調用rand()時,系統的時間還沒有更新,所以得到的隨機種子在一段時間內是完全相同的,因此一般只在進行一次大批隨機數產生之前進行一次隨機種子的初始化。下面的代碼產生了400個在-1~1之間的平均分布的隨機數。

double dValue[400];
        srand(GetTickCount());
        for(int i= 0;i < 400; i++)
        {
        double dValue[i] = AverageRandom(-1,1);
        }
用該方法產生的隨機數運行結果如圖1所示:



圖1 400個-1~1之間平均分布的隨機數

二、任意分布隨機數的產生
   下面提出了一種已知概率密度函數的分布的隨機數的產生方法,以典型的正態分布為例來說名任意分布的隨機數的產生方法。
   如果一個隨機數序列服從一維正態分布,那麼它有有如下的概率密度函數:



图片附件: 1.gif (2006-4-20 10:08 AM, 2.69 K)



其中μ,σ( >0)為常數,它們分別為數學期望和均方差,如果讀者對數學期望和均方差的概念還不大清楚,請查閱有關概率論的書。如果取μ =0,σ =0.2,則其曲線為




圖2 正態分布的概率密度函數曲線
從圖中可以看出,在μ附近的概率密度大,遠離μ的地方概率密度小,我們要產生的隨機數要服從這種分布,就是要使產生的隨機數在μ附近的概率要大,遠離μ處小,怎樣保證這一點呢,可以采用如下的方法:在圖2的大矩形中隨機產生點,這些點是平均分布的,如果產生的點落在概率密度曲線的下方,則認為產生的點是符合要求的,將它們保留,如果在概率密度曲線的上方,則認為這些點不合格,將它們去處。如果隨機產生了一大批在整個矩形中均勻分布的點,那麼被保留下來的點的橫坐標就服從了正態分布。可以設想,由於在μ處的f(x)的值比較大,理所當然的在μ附近的點個數要多,遠離μ處的少,這從面積上就可以看出來。我們要產生的隨機數就是這裡的橫坐標。
   基於以上思想,我們可以用程序實現在一定范圍內服從正態分布的隨機數。程序如下:

double Normal(double x,double miu,double sigma) //概率密度函數
        {
        return 1.0/sqrt(2*PI*sigma) * exp(-1*(x-miu)*(x-miu)/(2*sigma*sigma));
        }
        double NormalRandom(double miu,                  double sigma,double min,double max)//產生正態分布隨機數
        {
        double x;
        double dScope;
        double y;
        do
        {
        x = AverageRandom(min,max);
        y = Normal(dResult, miu, sigma);
        dScope = AverageRandom(0, Normal(miu,miu,sigma));
        }while( dScope > y);
        return x;
        }
參數說明:double miu:μ,正態函數的數學期望

本新闻共3页,当前在第2页  1  2  3  

〖责任编辑:肥鱼〗 发送给好友 打印 顶部
会员名称:
密码:匿名 ·注册·忘记密码?
评论内容:
(最多300个字符)
  查看评论

推荐教程

热点教程

请尊重别人的劳动,原创教程转载必须注明作者及出处
中国教程网简介 | 业务合作 | 广告服务 | 联系我们 | 招聘信息 | English | 网站地图 | 客服中心

中国教程网
©2005-2007