-
當前位置:首頁 > 創(chuàng)意學院 > 營銷推廣 > 專題列表 > 正文
偽隨機數(shù)計算公式
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關于偽隨機數(shù)計算公式的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關鍵詞,就能返回你想要的內容,有小程序、在線網(wǎng)頁版、PC客戶端和批量生成器
問友Ai官網(wǎng):https://ai.de1919.com。
本文目錄:
偽隨機數(shù)的生成方法
一般地,偽隨機數(shù)的生成方法主要有以下3種:
(1) 直接法(Direct Method),根據(jù)分布函數(shù)的物理意義生成。缺點是僅適用于某些具有特殊分布的隨機數(shù),如二項式分布、泊松分布。
(2) 逆轉法(Inversion Method),假設U服從[0,1]區(qū)間上的均勻分布,令X=F-1(U),則X的累計分布函數(shù)(CDF)為F。該方法原理簡單、編程方便、適用性廣。
(3)接受拒絕法(Acceptance-Rejection Method):假設希望生成的隨機數(shù)的概率密度函數(shù)(PDF)為f,則首先找到一個PDF為g的隨機數(shù)發(fā)生器與常數(shù)c,使得f(x)≤cg(x),然后根據(jù)接收拒絕算法求解。由于算法平均運算c次才能得到一個希望生成的隨機數(shù),因此c的取值必須盡可能小。顯然,該算法的缺點是較難確定g與c。
因此,偽隨機數(shù)生成器(PRNG)一般采用逆轉法,其基礎是均勻分布,均勻分布PRNG的優(yōu)劣決定了整個隨機數(shù)體系的優(yōu)劣[7]。下文研究均勻分布的PRNG。
聽說計算機產(chǎn)生的隨機數(shù)是偽隨機數(shù),公式有誰知道。
用S作隨機模擬計算作為統(tǒng)計工作者,我們除了可以用S迅速實現(xiàn)新的統(tǒng)計方法,還可以用S進行隨機模擬。隨機模擬可以驗證我們的算法、比較不同算法的的優(yōu)缺點、發(fā)現(xiàn)改進統(tǒng)計方法的方向,是進行統(tǒng)計研究的最有力的計算工具之一。
隨機模擬最基本的需要是產(chǎn)生偽隨機數(shù),S中已提供了大多數(shù)常用分布的偽隨機數(shù)函數(shù),可以返回一個偽隨機數(shù)序列向量。這些偽隨機數(shù)函數(shù)以字母r開頭,比如rnorm()是正態(tài)偽隨機數(shù)函數(shù),runif()是均勻分布偽隨機數(shù)函數(shù),其第一個自變量是偽隨機數(shù)序列長度n。關于這些函數(shù)可以參見第14節(jié)以及系統(tǒng)幫助文件。下例產(chǎn)生1000個標準正態(tài)偽隨機數(shù):
>
y
<-
rnorm(1000)
這些偽隨機數(shù)函數(shù)也可以指定與分布有關的參數(shù),比如下例產(chǎn)生1000個均值為150、標準差為100的正態(tài)偽隨機數(shù):
>
y
<-
rnorm(1000,
mean=150,
sd=100)
產(chǎn)生偽隨機數(shù)序列是不重復的,實際上,S在產(chǎn)生偽隨機數(shù)時從一個種子出發(fā),不斷迭代更新種子,所以產(chǎn)生若干隨機數(shù)后內部的隨機數(shù)種子就已經(jīng)改變了。有時我們需要模擬結果是可重復的,這只要我們保存當前的隨機數(shù)種子,然后在每次產(chǎn)生偽隨機數(shù)序列之前把隨機數(shù)種子置為保存值即可:
>
the.seed
<-
.Random.seed
>
……………
>
.Random.seed
<-
the.seed
>
y
<-
rnorm(1000)
作為例子,我們來產(chǎn)生服從一個簡單的線性回歸的數(shù)據(jù)。
#
簡單線性回歸的模擬
lm.simu
<-
function(n){
#
先生成自變量。假設自變量x的取值范圍在150到180之間,大致服從正態(tài)分布。
x
<-
rnorm(n,
mean=165,
sd=7.5)
#
再生成模型誤差。假設服從N(0,
1.2)分布
eps
<-
rnorm(n,
0,
1.2)
#
用模型生成因變量
y
<-
0.8
*
x
+
eps
return(data.frame(y,x))
}
S沒有提供多元隨機變量的模擬程序,這里給出一個進行三元正態(tài)隨機變量模擬的例子。假設要三元正態(tài)隨機向量
的
n個獨立觀測,可以先產(chǎn)生n個服從三元標準正態(tài)分布的觀測,放在一個
n行3列的矩陣中:
U
<-
matrix(rnorm(3*n),
ncol=3,
byrow=T)
可以認為矩陣U的每一行是一個標準的三元正態(tài)分布的觀測。設矩陣
的Choleski分解為
,
A為上三角矩陣,若隨機向量
,則
。因此,
作為一個三行
n列的矩陣每一行都是服從
分布的,且各行之間獨立。經(jīng)過轉置,產(chǎn)生的
X
X
<-
matrix(rep(mu,n),
ncol=3,
byrow=T)
+
U
%*%
A
是一個
n行三列的矩陣。
有時模擬需要的計算量很大,多的時候甚至要計算幾天的時間。對于這種問題我們要善于把問題拆分成可以單獨計算的小問題,然后單獨計算每個小問題,把結果保存在S對象中或文本文件中,最后綜合保存的結果得到最終結果。
如果某一個問題需要的計算時間比較長,我們在編程時可以采用以下的技巧:每隔一定時間就顯示一下任務的進度,以免計算已經(jīng)出錯或進入死循環(huán)還不知道;應該把中間結果每隔一段時間就記錄到一個文本文件中(cat()函數(shù)可以帶一個file參數(shù)和append參數(shù),對這種記錄方法提供了支持),如果需要中斷程序,中間結果可能是有用的,有些情況下還可以根據(jù)記錄的中間結果從程序中斷的地方繼續(xù)執(zhí)行。
參考文獻:
http://www.math.pku.edu.cn/teachers/lidf/docs/statsoft/html/s/13.html
隨機數(shù)和偽隨機數(shù)的計算公式都是什么呀?
為追求真正的隨機序列,人們曾采用很多種原始的物理方法用于生成一定范圍內滿足精度(位數(shù))的均勻分布序列,其缺點在于:速度慢、效率低、需占用大量存儲空間且不可重現(xiàn)等。為滿足計算機模擬研究的需求,人們轉而研究用算法生成模擬各種概率分布的偽隨機序列。偽隨機數(shù)是指用數(shù)學遞推公式所產(chǎn)生的隨機數(shù)。從實用的角度看,獲取這種數(shù)的最簡單和最自然的方法是利用計算機語言的函數(shù)庫提供的隨機數(shù)發(fā)生器。典型情況下,它會輸出一個均勻分布在0和1區(qū)間內的偽隨機變量的值。其中應用的最為廣泛、研究最徹底的一個算法即線性同余法。線性同余法LCG(Linear Congruence Generator)
選取足夠大的正整數(shù)M和任意自然數(shù)n0,a,b,由遞推公式:
ni+1=(af(ni)+b)mod M i=0,1,…,M-1
生成的數(shù)值序列稱為是同余序列。當函數(shù)f(n)為線性函數(shù)時,即得到線性同余序列:
ni+1=(a*ni+b)mod M i=0,1,…,M-1
以下是線性同余法生成偽隨機數(shù)的偽代碼:
Random(n,m,seed,a,b)
{
r0 = seed;
for (i = 1;i<=n;i++)
ri = (a*ri-1 + b) mod m
}
其中種子參數(shù)seed可以任意選擇,常常將它設為計算機當前的日期或者時間;m是一個較大數(shù),可以把它取為2w,w是計算機的字長;a可以是0.01w和0.99w之間的任何整數(shù)。
應用遞推公式產(chǎn)生均勻分布隨機數(shù)時,式中參數(shù)n0,a,b,M的選取十分重要。
例如,選取M=10,a=b =n0=7,生成的隨機序列為{6,9,0,7,6,9,……},周期為4。
取M=16,a=5,b =3,n0=7,生成的隨機序列為{6,1,8,11,10,5,12,15,14,9,0,3,2,13,4,7,6,1……},周期為16。
取M=8,a=5,b =1,n0=1,生成的隨機序列為{6,7,4,5,2,3,0,1,6,7……},周期為8。
Visual C++中偽隨機數(shù)生成機制
用VC產(chǎn)生隨機數(shù)有兩個函數(shù),分別為rand(void)和srand(seed)。rand()產(chǎn)生的隨機整數(shù)是在0~RAND_MAX之間平均分布的,RAND_MAX是一個常量(定義為:#define RAND_MAX 0x7fff)。它是short型數(shù)據(jù)的最大值,如果要產(chǎn)生一個浮點型的隨機數(shù),可以將rand()/1000.0,這樣就得到一個0~32.767之間平均分布的隨機浮點數(shù)。如果要使得范圍大一點,那么可以通過產(chǎn)生幾個隨機數(shù)的線性組合來實現(xiàn)任意范圍內的平均分布的隨機數(shù)。
其用法是先調用srand函數(shù),如
srand( (unsigned)time( NULL ) )
這樣可以使得每次產(chǎn)生的隨機數(shù)序列不同。如果計算偽隨機序列的初始數(shù)值(稱為種子)相同,則計算出來的偽隨機序列就是完全相同的。要解決這個問題,需要在每次產(chǎn)生隨機序列前,先指定不同的種子,這樣計算出來的隨機序列就不會完全相同了。以time函數(shù)值(即當前時間)作為種子數(shù),因為兩次調用rand函數(shù)的時間通常是不同的,這樣就可以保證隨機性了。也可以使用srand函數(shù)來人為指定種子數(shù)分析以下兩個程序段,
程序段1:
//包含頭文件
void main() {
int count=0;
for (int i=0;i<10;i++){
srand((unsigned)time(NULL));
count++;
cout<<"No"<
//包含頭文件
void main() {
int count=0;
srand((unsigned)time(NULL));
for (int i=0;i<10;i++){
count++;
cout<<"No"<
No1=9694 No2=9694 No3=9694 No4=9694 No5=9694
No6=9694 No7=9694 No8=9694 No9=9694 No10=9694
程序段2的運行結果為:
No1=10351 No2=444 No3=11351 No4=3074 No5=21497
No6=30426 No7=6246 No8=24614 No9=22089 No10=21498
可以發(fā)現(xiàn),以上兩個程序段由于隨機數(shù)生成時選擇的種子的不同,運行的結果也不一樣。rand()函數(shù)返回隨機數(shù)序列中的下一個數(shù)(實際上是一個偽隨機數(shù)序列,序列中的每一個數(shù)是由對其前面的數(shù)字進行復雜變換得到的)。為了模仿真正的隨機性,首先要調用srand()函數(shù)給序列設置一個種子。為了更好地滿足隨機性,使用了時間函數(shù)time(),以便取到一個隨時間變化的值,使每次運行rand()函數(shù)時從srand()函數(shù)所得到的種子值不相同。偽隨機數(shù)生成器將作為"種子"的數(shù)當作初始整數(shù)傳給函數(shù)。這粒種子會使這個球(生成偽隨機數(shù))一直滾下去。
程序段1中由于將srand()函數(shù)放在循環(huán)體內,而程序執(zhí)行的CPU時間較快,調用time函數(shù)獲取的時間精度卻較低(55ms),這樣循環(huán)體內每次產(chǎn)生隨機數(shù)用到的種子數(shù)都是一樣的,因此產(chǎn)生的隨機數(shù)也是一樣的。而程序段2中第1次產(chǎn)生的隨機數(shù)要用到隨機種子,以后的每次產(chǎn)生隨機數(shù)都是利用遞推關系得到的。 基于MFC的隨機校驗碼生成
Web應用程序中經(jīng)常要利用到隨機校驗碼,校驗碼的主要作用是防止黑客利用工具軟件在線破譯用戶登錄密碼,校驗碼、用戶名、密碼三者配合組成了進入Web應用系統(tǒng)的鑰匙。在利用VC開發(fā)的基于客戶機/瀏覽器(Client/Server)模式的應用軟件系統(tǒng)中,為了防止非法用戶入侵系統(tǒng),通常也要運用隨機校驗碼生成技術。
以上就是關于偽隨機數(shù)計算公式相關問題的回答。希望能幫到你,如有更多相關問題,您也可以聯(lián)系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內容。
推薦閱讀:
網(wǎng)易游戲人氣排行榜(網(wǎng)易游戲人氣排行榜端游)