⑴ 求各種產生隨機數的演算法
多的很呀!別撤消呀,千萬! 不過幾乎都是偽隨機數。 隨機序列的演算法 找到了兩個演算法, 第一個很簡單, 但可惜不是隨機的, 第二個是典型的偽隨機數演算法, 可惜要用到2的幾百萬次方這樣巨大的整數, 真痛苦 要是有UNIX上計算密碼的源代碼就好了 第一種做法: f(k) = (k*F(N-1)) mod F(N)其中, k是一個序列號, 就是要取的那個數的順序號 F(N)是這樣一個序列 F(0) = 0, F(1) = 1, F(N+2) = F(N+1)+F(N) (for N>=0)第二種做法V = ( ( V * 2 ) + B .xor. B ... )(Mod 2^n)N+1 N 0 2V是要取的隨機數, B是個種子, n是隨機數的最大個數 原來這個問題, 很高難, 不少數學高手都為解決這個問題寫了論文, 咳咳, 偶真是個白痴 呵呵, 效果肯定是不錯啦, 因為用不到很大的表. 至於應用是這樣的, 比如, 你要給每個用戶在注冊的時候一個ID但有不希望用戶在看到自己的ID的時候能知道其他用戶的ID, 如果用SEQUENCE來生成ID的話, 一個用戶只要把自己的ID減1就能得到其它用戶的ID了. 所以要用隨機數來做ID, 這樣用戶很難猜到其他用戶的ID了. 當然主要的問題是, 隨機數可能重復. 因此希望使用一個隨機數做種子用它來確定一組"無規律"的自然數序列, 並且在這個序列中不會出現重復的自然數. 在這里使用的方法生成的序列並不是沒有規律的, 只不過這個軌律很難被發現就是了. Xn+1 = (aXn + b) mod c (其中, abc通常是質數)是一種被廣泛使用的最簡單的隨機數發生演算法, 有研究表表明這個演算法生成的隨機數基本上符合統計規律, JAVA, BORLAND C等用的都是這個方法, 一般只要保證第一個種子是真正的隨機數就行了, 下面來說一下重復的問題, 上述方法會有可能出現重復, 因為當(aXn + b)有可能是同樣的數或者說余數相同的數, 因此要想不重復就得變形 偶想到的方法是 Xn=(a*n + b) mod c n是一個在1到c之間的整數, a*n + b就是一個線性公式了, 且若n不同則a*n + b也不同, 它們除上質數c得到的余數也肯定不同, 因為 若不考慮a和b而只有n的時候, 每次的結果都是n,而線性公式, 只不過移動了這條直線的位置和斜率而已, 每個結果仍然不會相同的, 為了增加不可預計性, 偶又為上面那個公式設計了, 隨機數種子, 於是就變成了這個樣子 F(N)=(隨機數*(N+隨機數))MOD 一個質數 這樣就能夠產生 1到選定質數之間的一個"無規律"的自然數序列了, 只要改變隨機數就能改變序列的次序 在應用的時候, 要把隨機數種子和最後用到的序列號保存到一個表裡, 每此使用的時候取出來算好, 再把序列號更新一下就可以了 具體地說, 就是可以建一個表來保存每個序列的隨機數種子, 然後再為這個序列建一個SEQUENCE就行瞭然後就SELECT MOD(序列控製表.隨機數*(SEQ.NEXTVAL+序列控製表.隨機數)),序列控製表.質數) FROM 序列控製表 WHERE 序列控製表.序列ID=XX就OK了注意 序列控製表.質數 決定了序列的范圍
⑵ 如何用計算機求隨機數
計算機隨機數是用一個隨機函數生成隨機數,但實際上並非無規律,他其實是將一個數通過某種過程生成另一個數,然後將生成的數再次進行此過程,直到出現循環(一定會出現循環),如:
設一個數a;
給a一個值;
對a進行某過程;//此過程一般很復雜
得到b;
再對b進行此過程;
(依次類推)
....
這樣的結果是能夠得到出現幾率幾乎相等的一組數,但他們是有規律的,是可以破解的.
但這只是菜鳥所用的"隨機數",真正的計算機隨機數可以做到隨機,
以上面的解釋為例,你可以多設幾個過程,根據時間決定使用哪個過程,或者把時間也作為一個參數,還有很多方法也可以做到隨機,總之,想破解隨機數是不可能的.
我是第一個回答的,如果你覺得夠詳細,就追加點分吧.
⑶ 什麼是偽隨機數與真隨機數
隨機數
計算機使用的隨機數是一種偽隨機數,偽隨機數有多種生成演算法,甚至還有硬體隨機數發生器,但也還是偽隨機數。
真隨機數符合正態分布且其生成不能重現,真隨機數在自然界中幾乎不存在。但如果一個隨機數能夠被重現的機率很小,則認為其為隨機數,稱為偽隨機數。
下面的演算法介紹了一種非常簡單的偽隨機數生成演算法,生成0到1之間的隨機數。
因為是偽隨機數,所以知道了隨機數演算法和種子,總能夠直到隨機數序列中任何一個隨機數的值,所以一般來說種子的設置都是使用當前時間的毫秒數,保證隨機數列的不重復性。
隨機數的應用非常廣泛,常見的加密解密都要用到,還有隨機篩選,計算概率等等。還有一個常見的例子就是計算hash表,利用了同樣的種子能得到同樣的隨機序列這種特性而採用隨機函數作為hash函數。
http://blog.clubbenq.com.cn/904569/archive/2005/08/09/13380.aspx
⑷ 電腦取隨機數是什麼原理,是真正的隨機數嗎
偽隨機數這個概念是相對於「真」隨機數而言。電腦通過發送種子數值,運用演算法產生某個看起來像隨機數的數字,但是實際上這個數字是可以預測的。因為電腦沒有從環境中收集到任何隨機信息。雖然是偽隨機數,但是並不是所有領域都不需要偽隨機數。比如,如果你在玩電子游戲,那麼游戲過程中是靠偽隨機數還是真隨機數並不重要。另一方面,如果你的應用正在加密,情況就不同了,因為你不希望攻擊者能夠猜到你的隨機數。舉個例子,如果攻擊者掌握了某隨機數生成器使用的種子數值和加密演算法,如果隨機數生成器完全依靠種子數值和加密演算法生成密文,這個過程中不添加任何額外隨機性,如果攻擊者掌握的情報足夠多,他們可以逆推來確定加密演算法一定會用到的偽隨機數,也就能破譯密文。
⑸ 如何能演算法生成真隨機數
K1——相同序列的概率非常低
K2——符合統計學的平均性,比如所有數字出現概率應該相同,卡方檢驗應該能通過,超長遊程長度概略應該非常小,自相關應該只有一個尖峰,任何長度的同一數字之後別的數字出現概率應該仍然是相等的等等
K3——不應該能夠從一段序列猜測出隨機數發生器的工作狀態或者下一個隨機數
K4——不應該從隨機數發生器的狀態能猜測出隨機數發生器以前的工作狀態
⑹ 隨機數的計算公式是什麼
為追求真正的隨機序列,人們曾採用很多種原始的物理方法用於生成一定范圍內滿足精度(位數)的均勻分布序列,其缺點在於:速度慢、效率低、需佔用大量存儲空間且不可重現等。為滿足計算機模擬研究的需求,人們轉而研究用演算法生成模擬各種概率分布的偽隨機序列。偽隨機數是指用數學遞推公式所產生的隨機數。從實用的角度看,獲取這種數的最簡單和最自然的方法是利用計算機語言的函數庫提供的隨機數發生器。典型情況下,它會輸出一個均勻分布在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。
⑺ 真實隨機數如何產生為什麼說真實隨機數可以抵抗惡意攻擊
隨機數(RNG)主要分為兩大類:偽隨機與物理隨機數。
偽隨機是由各種演算法產生的,本質上是決定論的,就是你輸入同一個初值,結果是確定的。當然這不是我們想要的。
物理隨機數是由物理過程產生的。分為三小類。Noise,chaos,quantum。
Noise和chaos是由經典物理過程產生的,也是決定論的。比如我們知道小球的初始條件,我們就可以預測小球未來的運動情況。這也不是我們想要的。
真隨機數是由量子過程產生的,其原理是基於uncertain principle。舉個最簡單的例子,當單個光子經過分束器BS的時候,有兩條路徑可以選擇,用任何理論都無法預測which way(隱變數理論除外),所以通過測量光子走了哪條路就可以產生真正的隨機數。當然這里要求探測設備和發射源是被信任的。如果被壞人操作,其實也產生不了隨機數。
那麼就不存在真隨機數嗎?No,device independent quantum random number(DI-QRNG)就可以實現。DI-QRNG是通過觀察貝爾不等式的違背來產生隨機數,這個過程是不依賴探測設備和源的,所以由DI-QRNG產生的真隨機數可以抵抗惡意攻擊。
⑻ 怎麼樣的一串數是真正的隨機數,而不是偽隨機數
計算機的「隨機數」並非真的「隨機數」,而是偽隨機數——也就是通過一系列演算法,從一個起始數字開始按照一定規則算出來的。
就好像函數F(x)一樣,x就是隨機數的種子。
你可以做個測試:把你的"new
Random(x)"裡面的x設置成一個固定數字,例如1,多次運行程序列印隨機數,你會發現每次運行列印出來的數字都是一樣的。
DateTime.Now.Ticks是指從1970年1月1日(具體哪年忘了哈,好像是1970)開始到目前所經過的毫秒數——刻度數。
用時間毫秒做隨機數的種子(x)可以盡量避免上面說的那種「隨機數」變成了「非隨機數」的情況。
解答完畢。
⑼ 隨機數演算法是什麼
在計算機中並沒有一個真正的隨機數發生器,但是可以做到使產生的數字重復率很低,這樣看起來好象是真正的隨機數,實現這一功能的程序叫偽隨機數發生器。有關如何產生隨機數的理論有許多如果要詳細地討論,需要厚厚的一本書的篇幅。不管用什麼方法實現隨機數發生器,都必須給它提供一個名為「種子」的初始值。而且這個值最好是隨機的,或者至少這個值是偽隨機的。「種子」的值通常是用快速計數寄存器或移位寄存器來生成的。下面講一講在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......餘下全文>>