中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
任意分布的隨機(jī)數(shù)的產(chǎn)生方法

摘要:
    隨機(jī)數(shù)在實(shí)際運(yùn)用中非常之多,如游戲設(shè)計(jì),信號(hào)處理,通常我們很容易得到平均分布的隨機(jī)數(shù)。但如何根據(jù)平均分布的隨機(jī)數(shù)進(jìn)而產(chǎn)生其它分布的隨機(jī)數(shù)呢?本文提出了一種基于幾何直觀面積的方法,以正態(tài)分布隨機(jī)數(shù)的產(chǎn)生為例討論了任意分布的隨機(jī)數(shù)的產(chǎn)生方法。

 正文:
一、平均分布隨機(jī)數(shù)的產(chǎn)生
    大家都知道,隨機(jī)數(shù)在各個(gè)方面都有很大的作用,在vc的環(huán)境下,為我們提供了庫(kù)函數(shù)rand()來產(chǎn)生一個(gè)隨機(jī)的整數(shù)。該隨機(jī)數(shù)是平均在0~RAND_MAX之間平均分布的,RAND_MAX是一個(gè)常量,在VC6.0環(huán)境下是這樣定義的:

#define RAND_MAX 0x7fff

   它是一個(gè)short 型數(shù)據(jù)的最大值,如果要產(chǎn)生一個(gè)浮點(diǎn)型的隨機(jī)數(shù),可以將rand()/1000.0這樣就得到一個(gè)0~32.767之間平均分布的隨機(jī)浮點(diǎn)數(shù)。如果要使得范圍大一點(diǎn),那么可以通過產(chǎn)生幾個(gè)隨機(jī)數(shù)的線性組合來實(shí)現(xiàn)任意范圍內(nèi)的平均分布的隨機(jī)數(shù)。例如要產(chǎn)生-1000~1000之間的精度為四位小數(shù)的平均分布的隨機(jī)數(shù)可以這樣來實(shí)現(xiàn)。先產(chǎn)生一個(gè)0到10000之間的隨機(jī)整數(shù)。方法如下 : 
int a = rand()%10000;

然后保留四位小數(shù)產(chǎn)生0~1之間的隨機(jī)小數(shù):
double b = (double)a/10000.0;

然后通過線性組合就可以實(shí)現(xiàn)任意范圍內(nèi)的隨機(jī)數(shù)的產(chǎn)生,要實(shí)現(xiàn)-1000~1000內(nèi)的平均分布的隨機(jī)數(shù)可以這樣做:
double dValue = (rand()%10000)/10000.0*1000-(rand()%10000)/10000.0*1000;

則dValue就是所要的值。
   到現(xiàn)在為止,你或許以為一切工作都已經(jīng)完成了,其實(shí)不然,仔細(xì)一看,你會(huì)發(fā)現(xiàn)有問題的,上面的式子化簡(jiǎn)后就變?yōu)椋?/span>
double dValue = (rand()%10000)/10.0-(rand()%10000)/10.0;

   這樣一來,產(chǎn)生的隨機(jī)數(shù)范圍是正確的,但是精度不正確了,變成了只有一位正確的小數(shù)的隨機(jī)數(shù)了,后面三位的小數(shù)都是零,顯然不是我們要求的,什么原因呢,又怎么辦呢。
   先找原因,rand()產(chǎn)生的隨機(jī)數(shù)分辨率為32767,兩個(gè)就是65534,而經(jīng)過求余后分辨度還要減小為10000,兩個(gè)就是20000而要求的分辨率為1000*10000*2=20000000,顯然遠(yuǎn)遠(yuǎn)不夠。下面提供的方法可以實(shí)現(xiàn)正確的結(jié)果:
double a = (rand()%10000) * (rand()%1000)/10000.0;
double b = (rand()%10000) * (rand()%1000)/10000.0;
double dValue = a-b;

   則dValue就是所要求的結(jié)果。在下面的函數(shù)中可以實(shí)現(xiàn)產(chǎn)生一個(gè)在一個(gè)區(qū)間之內(nèi)的平均分布的隨機(jī)數(shù),精度是4位小數(shù)。
double AverageRandom(double min,double max)
{
int minInteger = (int)(min*10000);
int maxInteger = (int)(max*10000);
int randInteger = rand()*rand();
int diffInteger = maxInteger - minInteger;
int resultInteger = randInteger % diffInteger + minInteger;
return resultInteger/10000.0;
}

   但是有一個(gè)值得注意的問題,隨機(jī)數(shù)的產(chǎn)生需要有一個(gè)隨機(jī)的種子,因?yàn)橛糜?jì)算機(jī)產(chǎn)生的隨機(jī)數(shù)是通過遞推的方法得來的,必須有一個(gè)初始值,也就是通常所說的隨機(jī)種子,如果不對(duì)隨機(jī)種子進(jìn)行初始化,那么計(jì)算機(jī)有一個(gè)確省的隨機(jī)種子,這樣每次遞推的結(jié)果就完全相同了,因此需要在每次程序運(yùn)行時(shí)對(duì)隨機(jī)種子進(jìn)行初始化,在vc中的方法是調(diào)用srand(int)這個(gè)函數(shù),其參數(shù)就是隨機(jī)種子,但是如果給一個(gè)常量,則得到的隨機(jī)序列就完全相同了,因此可以使用系統(tǒng)的時(shí)間來作為隨機(jī)種子,因?yàn)橄到y(tǒng)時(shí)間可以保證它的隨機(jī)性。
   調(diào)用方法是srand(GetTickCount()),但是又不能在每次調(diào)用rand()的時(shí)候都用srand(GetTickCount())來初始化,因?yàn)楝F(xiàn)在計(jì)算機(jī)運(yùn)行時(shí)間比較快,當(dāng)連續(xù)調(diào)用rand()時(shí),系統(tǒng)的時(shí)間還沒有更新,所以得到的隨機(jī)種子在一段時(shí)間內(nèi)是完全相同的,因此一般只在進(jìn)行一次大批隨機(jī)數(shù)產(chǎn)生之前進(jìn)行一次隨機(jī)種子的初始化。下面的代碼產(chǎn)生了400個(gè)在-1~1之間的平均分布的隨機(jī)數(shù)。
double dValue[400];
srand(GetTickCount());
for(int i= 0;i < 400; i++)
{
double dValue[i] = AverageRandom(-1,1);
}

用該方法產(chǎn)生的隨機(jī)數(shù)運(yùn)行結(jié)果如圖1所示:

                  圖1 400個(gè)-1~1之間平均分布的隨機(jī)數(shù)
二、任意分布隨機(jī)數(shù)的產(chǎn)生
   下面提出了一種已知概率密度函數(shù)的分布的隨機(jī)數(shù)的產(chǎn)生方法,以典型的正態(tài)分布為例來說名任意分布的隨機(jī)數(shù)的產(chǎn)生方法。
   如果一個(gè)隨機(jī)數(shù)序列服從一維正態(tài)分布,那么它有有如下的概率密度函數(shù):
(1-1)
其中μ,σ( >0)為常數(shù),它們分別為數(shù)學(xué)期望和均方差,如果讀者對(duì)數(shù)學(xué)期望和均方差的概念還不大清楚,請(qǐng)查閱有關(guān)概率論的書。如果取μ =0,σ =0.2,則其曲線為

                  圖2 正態(tài)分布的概率密度函數(shù)曲線
   從圖中可以看出,在μ附近的概率密度大,遠(yuǎn)離μ的地方概率密度小,我們要產(chǎn)生的隨機(jī)數(shù)要服從這種分布,就是要使產(chǎn)生的隨機(jī)數(shù)在μ附近的概率要大,遠(yuǎn)離μ處小,怎樣保證這一點(diǎn)呢,可以采用如下的方法:在圖2的大矩形中隨機(jī)產(chǎn)生點(diǎn),這些點(diǎn)是平均分布的,如果產(chǎn)生的點(diǎn)落在概率密度曲線的下方,則認(rèn)為產(chǎn)生的點(diǎn)是符合要求的,將它們保留,如果在概率密度曲線的上方,則認(rèn)為這些點(diǎn)不合格,將它們?nèi)ヌ?。如果隨機(jī)產(chǎn)生了一大批在整個(gè)矩形中均勻分布的點(diǎn),那么被保留下來的點(diǎn)的橫坐標(biāo)就服從了正態(tài)分布??梢栽O(shè)想,由于在μ處的f(x)的值比較大,理所當(dāng)然的在μ附近的點(diǎn)個(gè)數(shù)要多,遠(yuǎn)離μ處的少,這從面積上就可以看出來。我們要產(chǎn)生的隨機(jī)數(shù)就是這里的橫坐標(biāo)。
   基于以上思想,我們可以用程序?qū)崿F(xiàn)在一定范圍內(nèi)服從正態(tài)分布的隨機(jī)數(shù)。程序如下:
double Normal(double x,double miu,double sigma) //概率密度函數(shù)
{
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)//產(chǎn)生正態(tài)分布隨機(jī)數(shù)
{
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;
}

參數(shù)說明:double miu:μ,正態(tài)函數(shù)的數(shù)學(xué)期望
                  double sigma:σ,正態(tài)函數(shù)的均方差
                  double min,double max,表明產(chǎn)生的隨機(jī)數(shù)的范圍
用如上方法,取 μ=0,σ=0.2,范圍是-1~1產(chǎn)生400個(gè)正態(tài)隨機(jī)數(shù)如圖3所示:

                   圖3 μ=0, σ=0.2,范圍在-1~1時(shí)的400個(gè)正態(tài)分布的隨機(jī)數(shù)分布圖
取 μ=0, σ=0.05,范圍是-1~1產(chǎn)生400個(gè)正態(tài)隨機(jī)數(shù)如圖4所示:

                   圖4 μ=0,σ=0.05,范圍在-1~1時(shí)的400個(gè)正態(tài)分布的隨機(jī)數(shù)分布圖
從圖3和圖4的比較可以看出, 越小,產(chǎn)生的隨機(jī)數(shù)靠近 的數(shù)量越多,也說明了產(chǎn)生的隨機(jī)數(shù)靠近 的概率越大。
我們,先產(chǎn)生4000個(gè)在0到4之間的正態(tài)分布的隨機(jī)數(shù),取μ=0,σ=0.2,再把產(chǎn)生的數(shù)據(jù)的數(shù)量做個(gè)統(tǒng)計(jì),畫成曲線,如下圖5所示:

                   圖5 μ=0, σ=0.2,范圍在0~4時(shí)的4000個(gè)正態(tài)分布的隨機(jī)數(shù)統(tǒng)計(jì)圖
從圖5中也可以看出,在靠近 處的產(chǎn)生的個(gè)數(shù)多,遠(yuǎn)離 處的產(chǎn)生的數(shù)量少,該圖的輪廓線和概率密度曲線的形狀剛好吻合。也就驗(yàn)證了該方法的正確性。
有了以上基礎(chǔ),也就用同樣的方法,只要知道概率密度函數(shù),也就不難產(chǎn)生任意分布的隨機(jī)數(shù),方法都是先產(chǎn)生一個(gè)點(diǎn),然后進(jìn)行取舍,落在概率密度曲線下方的點(diǎn)就滿足要求,取其橫坐標(biāo)就是所要獲取的隨機(jī)數(shù)。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C語(yǔ)言產(chǎn)生滿足正態(tài)分布的隨機(jī)數(shù)
MATLAB隨機(jī)數(shù)的生成 - 項(xiàng)目反應(yīng)理論與MATLAB MySpace聚友博客
隨機(jī)數(shù)產(chǎn)生原理及應(yīng)用 - 夢(mèng)想的高度
C++生成隨機(jī)數(shù):高斯/正態(tài)分布(gaussian/normal distribution)
matlab中隨機(jī)數(shù)的問題
VB.NET函數(shù)
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服