『壹』 隨機數生成方案(計算方法)
諾依曼的平方數取中法。
先通過求關鍵碼的平方值,從而擴大相近數的差別,然後根據表長度取中間的幾位數(往往取二進制的比特位)
『貳』 隨機數和偽隨機數的計算公式都是什麼呀
為追求真正的隨機序列,人們曾採用很多種原始的物理方法用於生成一定范圍內滿足精度(位數)的均勻分布序列,其缺點在於:速度慢、效率低、需佔用大量存儲空間且不可重現等。為滿足計算機模擬研究的需求,人們轉而研究用演算法生成模擬各種概率分布的偽隨機序列。偽隨機數是指用數學遞推公式所產生的隨機數。從實用的角度看,獲取這種數的最簡單和最自然的方法是利用計算機語言的函數庫提供的隨機數發生器。典型情況下,它會輸出一個均勻分布在0和1區間內的偽隨機變數的值。其中應用的最為廣泛、研究最徹底的一個演算法即線性同餘法。
線性同餘法LCG(Linear Congruence Generator)
選取足夠大的正整數M和任意自然數n0,a,b,由遞推公式:
ni+1=(af(ni)+b)mod M i=0,1,…,M-1
生成的數值序列稱為是同餘序列。當函數f(n)為線性函數時,即得到線性同餘序列:
ni+1=(a*ni+b)mod M i=0,1,…,M-1
以下是線性同餘法生成偽隨機數的偽代碼:
Random(n,m,seed,a,b)
{
r0 = seed;
for (i = 1;i<=n;i++)
ri = (a*ri-1 + b) mod m
}
其中種子參數seed可以任意選擇,常常將它設為計算機當前的日期或者時間;m是一個較大數,可以把它取為2w,w是計算機的字長;a可以是0.01w和0.99w之間的任何整數。
應用遞推公式產生均勻分布隨機數時,式中參數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++中偽隨機數生成機制
用VC產生隨機數有兩個函數,分別為rand(void)和srand(seed)。rand()產生的隨機整數是在0~RAND_MAX之間平均分布的,RAND_MAX是一個常量(定義為:#define RAND_MAX 0x7fff)。它是short型數據的最大值,如果要產生一個浮點型的隨機數,可以將rand()/1000.0,這樣就得到一個0~32.767之間平均分布的隨機浮點數。如果要使得范圍大一點,那麼可以通過產生幾個隨機數的線性組合來實現任意范圍內的平均分布的隨機數。
其用法是先調用srand函數,如
srand( (unsigned)time( NULL ) )
這樣可以使得每次產生的隨機數序列不同。如果計算偽隨機序列的初始數值(稱為種子)相同,則計算出來的偽隨機序列就是完全相同的。要解決這個問題,需要在每次產生隨機序列前,先指定不同的種子,這樣計算出來的隨機序列就不會完全相同了。以time函數值(即當前時間)作為種子數,因為兩次調用rand函數的時間通常是不同的,這樣就可以保證隨機性了。也可以使用srand函數來人為指定種子數分析以下兩個程序段,
程序段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
可以發現,以上兩個程序段由於隨機數生成時選擇的種子的不同,運行的結果也不一樣。rand()函數返回隨機數序列中的下一個數(實際上是一個偽隨機數序列,序列中的每一個數是由對其前面的數字進行復雜變換得到的)。為了模模擬正的隨機性,首先要調用srand()函數給序列設置一個種子。為了更好地滿足隨機性,使用了時間函數time(),以便取到一個隨時間變化的值,使每次運行rand()函數時從srand()函數所得到的種子值不相同。偽隨機數生成器將作為"種子"的數當作初始整數傳給函數。這粒種子會使這個球(生成偽隨機數)一直滾下去。
程序段1中由於將srand()函數放在循環體內,而程序執行的CPU時間較快,調用time函數獲取的時間精度卻較低(55ms),這樣循環體內每次產生隨機數用到的種子數都是一樣的,因此產生的隨機數也是一樣的。而程序段2中第1次產生的隨機數要用到隨機種子,以後的每次產生隨機數都是利用遞推關系得到的。 基於MFC的隨機校驗碼生成
Web應用程序中經常要利用到隨機校驗碼,校驗碼的主要作用是防止黑客利用工具軟體在線破譯用戶登錄密碼,校驗碼、用戶名、密碼三者配合組成了進入Web應用系統的鑰匙。在利用VC開發的基於客戶機/瀏覽器(Client/Server)模式的應用軟體系統中,為了防止非法用戶入侵系統,通常也要運用隨機校驗碼生成技術。
『叄』 求隨機數常用演算法
一般隨機數都不是完全隨機的,你在一個程序里兩次調用系統的隨機函數,你會發現是一樣的!
給你個思路,用系統函數得到當前進程的開始時間,然後處理這個時間,演算法想怎麼寫就怎麼寫,因為每次程序運行時間的不一樣的,所以得到的隨機數就「隨機」了,很多隨機函數都是這么做的!
『肆』 隨機模擬方法
2.2.1 隨機模擬的直接演算法
對隨機問題(帶有場域隨機性或時域隨機性)分析的直接模擬方法的基本步驟是:
(1)建立描述和刻畫系統行為功能的確定性分析模型,並確定其求解方法。
(2)分析和確認基本的隨機變數(隨機場)及其分布函數。採用蒙特卡羅方法產生隨機數(隨機樣本)。
(3)根據所產生的隨機樣本,按確定性分析方法求解所模擬問題的輸出量(系統反應)。
(4)計算分析系統反應量的樣本反應估計值,如樣本反應均值,樣本反應方差及樣本反應譜密度估計等。
2.2.2 Neumann展開演算法
對許多工程問題的分析計算最終都歸結為計算求解下列形式的線性方程組:
地下水系統隨機模擬與管理
式中:K——受隨機變數影響的系統結構整體剛度矩陣;
F——由邊界和系統外部條件確定的列向量;
H——系統狀態反應列向量。
由於矩陣K一般具有對稱正定性,所以可用Cholesky分解法求解上述方程,即取:
地下水系統隨機模擬與管理
而H可由下列兩步求解過程給出:
地下水系統隨機模擬與管理
在隨機模擬的直接演算法中,每產生一次隨機樣本結構,就要進行一次(2.14)式的分解運算,而為了獲得更加精確的隨機樣本的統計量,必然會有大量的隨機樣本產生,所以其計算工作量非常之大,而利用Neumann展開思想,可以在全部模擬計算過程中只進行Cholwsky分解,從而使計算工作量大大降低。為此設:
地下水系統隨機模擬與管理
式中:K0——均值參數結構所對應的系統整體結構矩陣;
ΔK——樣本結構關於均值參數結構的偏差部分。
顯然:
地下水系統隨機模擬與管理
由式(2.13)及式(2.17)有:
令:
地下水系統隨機模擬與管理
則由Neuman展開公式有:
地下水系統隨機模擬與管理
將式(2.21)代入式(2.19)有:
地下水系統隨機模擬與管理
顯然可得下列遞推公式:
地下水系統隨機模擬與管理
將式(2.20)代入式(2.23)並稍作變換即有:
地下水系統隨機模擬與管理
於是,一旦由K0 H0=F(2.25)
求出H0,即可用遞推公式依此求得H1,H2,…,Hn。代入(2.22)便得樣本反應量H。
原則上,Neumann展開演算法只是隨機模擬演算法實施過程中為節省運算工作量而採取的一項技術措施,而對於隨機模擬的思想則未做任何改進。
2.2.3 攝動演算法
對於確定性物理問題的控制方程可以表示為帶有小參數的方程。
地下水系統隨機模擬與管理
式中:L——一般的線性運算元;
H——所研究物理問題的解,H一般可表示為H=H(X,ε);
X——控制自變數;
ε——小參數。
一般地說,方程(2.26)所描述的問題往往不能精確地解出,但根據H為X和ε的函數且ε是小參數的特點,可以用ε的一個漸近展開式來表示H,即:
地下水系統隨機模擬與管理
式中Hi(x)與ε無關。
將式(2.27)代入式(2.26),並將ε的同次冪系數合並起來可得:
地下水系統隨機模擬與管理
式中:L0,L1,L2,…——空間H中的線性運算元;
h——關於x的實函數,可根據具體情況給出它們的形式。
由於方程(2.28)對所有的ε都必須成立,又因為ε的序列是線性無關的,故ε各次冪前面的系數項必須自動為零,即有:
地下水系統隨機模擬與管理
式(2.29)構成了關於Hi(x)的遞推方程組。
根據邊初值條件可依次求得序列H0,H1,H2,…從而代入式(2.27)可得H(x,ε)的近似解。
將上述關於確定性物理問題的攝動求解思想推廣到帶有隨機參數的問題中來,就構成了隨機參數攝動問題,為此,設所考慮問題的隨機微分運算元方程為:
地下水系統隨機模擬與管理
式中:L——運算元符號;
x——自變數;
ξ——某一給定分布的隨機變數;
Y——一隨機函數,可表示為Y=Y(x,ξ)。
隨機變數 可轉化為用標准隨機變數表示的形式:
地下水系統隨機模擬與管理
式中:ξ0——隨機變數ξ的均值;
ξr——隨機變數ξ的均方差;
b——均值為零,方差為1的標准化隨機變數。
將式(2.31)代入式(2.30)有:
地下水系統隨機模擬與管理
利用隨機函數的冪級數展開式可將解Y(x,ξ)展開為關於隨機變數b的級數:
地下水系統隨機模擬與管理
由於-b=0,故上式可表示為:
地下水系統隨機模擬與管理
由於 y 未知,所以系數式等也是未知的,但可將上式等價地寫為:
地下水系統隨機模擬與管理
顯然,上式中的系數Ui(x)與b無關,為一確定性函數。
將式(2.34)代入式(2.32)並經適當的運算後將b的不同次冪系數項合並起來,可得:
地下水系統隨機模擬與管理
式中:L0,L1,L2,…,Ln——確定性運算元;
h——關於x的實函數。
由於隨機變數b具有任意性,因此,式(2.35)成立的充分條件是各系數項皆為零,由此可得:
地下水系統隨機模擬與管理
上述方程組為一組確定性運算元方程,當給定邊界條件和初值條件以後,便可依次求出解U0,U1,U2,…回代方程(2.13)後即可得到y(x,ξ)的形式解答,而解答的均值與方差分別為:
地下水系統隨機模擬與管理
『伍』 有哪些隨機數演算法呢
1、數值概率演算法:用於數值問題的求解。所得到的解幾乎都是近似解,近似解的精度
隨著計算時間的增加而不斷地提高。
2、拉斯維加斯演算法(LasVegas):要麼給出問題的正確答案,要麼得不到答案。反復求解多次,可
使失效的概率任意小。
3、蒙特卡羅演算法(MonteCarlo):總能得到問題的答案,偶然產生不正確的答案。重復運行,每一次
都進行隨機選擇,可使不正確答案的概率變得任意小。
4、舍伍德演算法(Sherwood):很多具有很好的平均運行時間的確定性演算法,在最壞的情況下性能很
壞。引入隨機性加以改造,可以消除或減少一般情況和最壞情況的差別。
『陸』 深度學慣用於預測非線性隨機數的演算法有哪些求演算法,謝謝!
摘要 #8生成對抗網路(GAN)
『柒』 隨機數演算法是什麼
在計算機中並沒有一個真正的隨機數發生器,但是可以做到使產生的數字重復率很低,這樣看起來好象是真正的隨機數,實現這一功能的程序叫偽隨機數發生器。有關如何產生隨機數的理論有許多如果要詳細地討論,需要厚厚的一本書的篇幅。不管用什麼方法實現隨機數發生器,都必須給它提供一個名為「種子」的初始值。而且這個值最好是隨機的,或者至少這個值是偽隨機的。「種子」的值通常是用快速計數寄存器或移位寄存器來生成的。下面講一講在C語言里所提供的隨機數發生器的用法。現在的C編譯器都提供了一個基於ANSI標準的偽隨機數發生器函數,用來生成隨機數。它們就是rand()和srand()函數。這二個函數的工作過程如下:」)首先給srand()提供一個種子,它是一個unsignedint類型,其取值范圍從0~65535;2)然後調用rand(),它會根據提供給srand()的種子值返回一個隨機數(在0到32767之間)3)根據需要多次調用rand(),從而不間斷地得到新的隨機數;4)無論什麼時候,都可以給srand()提供一個新的種子,從而進一步「隨機化」rand()的輸出結果。這個過程看起來很簡單,問題是如果你每次調用srand()時都提供相同的種子值,那麼,你將會得到相同的隨機數序列,這時看到的現象是沒有隨機數,而每一次的數都是一樣的了。例如,在以17為種子值調用srand()之後,在首次調用rand()時,得到隨機數94。在第二次和第三次調用rand()時將分別得到26602和30017,這些數看上去是很隨機的(盡管這只是一個很小的數據點集合),但是,在你再次以17為種子值調用srand()後,在對於rand()的前三次調用中,所得的返回值仍然是在對94,26602,30017,並且此後得到的返回值仍然是在對rand()的第一批調用中所得到的其餘的返回值。因此只有再次給srand()提供一個隨機的種子值,才能再次得到一個隨機數。下面的例子用一種簡單而有效的方法來產生一個相當隨機的「種子」值----當天的時間值:g#椋睿悖歟醯洌澹Γ歟簦唬螅簦洌椋錚瑁Γ紓簦弧。#椋睿悖歟醯洌澹Γ歟簦唬螅簦洌歟椋猓瑁Γ紓簦弧。#椋睿悖歟醯洌澹Γ歟簦唬螅螅Γ#矗罰唬簦穡澹螅瑁Γ紓簦弧。#椋睿悖歟醯洌澹Γ歟簦唬螅螅Γ#矗罰唬簦椋恚澹猓瑁Γ紓簦弧。觶錚椋洹。恚幔椋睿ǎ觶錚椋洌。。椋睿簟。椋弧。醯睿螅椋紓睿澹洹。椋睿簟。螅澹澹洌鄭幔歟弧。螅簦潁醯悖簟。簦椋恚澹狻。簦椋恚澹攏醯媯弧。媯簦椋恚澹ǎΓ幔恚穡唬簦椋恚澹攏醯媯弧。螅澹澹洌鄭幔歟劍ǎǎǎǎ醯睿螅椋紓睿澹洹。椋睿簦簦椋恚澹攏醯媯簦椋恚澹Γ幔恚穡唬埃疲疲疲疲。ǎ醯睿螅椋紓睿澹洹。椋睿簦簦椋恚澹攏醯媯恚椋歟歟椋簦恚蕖。ǎ醯睿螅椋紓睿澹洹。椋睿簦簦椋恚澹攏醯媯恚椋歟歟椋簦恚弧。螅潁幔睿洌ǎǎ醯睿螅椋紓睿澹洹。椋睿簦螅澹澹洌鄭幔歟弧。媯錚潁ǎ椋劍埃唬椋Γ歟簦唬保埃唬椋。穡潁椋睿簦媯ǎΓ瘢醯錚簦唬ィ叮洌Γ#梗玻唬睿Γ瘢醯錚簦籦egjrand());}上面的程序先是調用_ftime()來檢查當前時間yc並把它的值存入結構成員timeBuf.time中wae當前時間的值從1970年1月1日開始以秒計算aeh在調用了_ftime()之後在結構timeBuf的成員millitm中還存入了當前那一秒已經度過的毫秒數,但在DOS中這個數字實際上是以百分之一秒來計算的。然後,把毫秒數和秒數相加,再和毫秒數進行異或運算。當然也可以對這兩個結構成員進行更多的計算,以控制se......餘下全文>>