導航:首頁 > 源碼編譯 > 隨機數生成演算法面試

隨機數生成演算法面試

發布時間:2022-08-22 03:38:16

1. 利用隨機函數產生N個隨機整數(20000以上),對這些數進行多種方法進行排序。

o ,老師作業吧,雖然想說書上都有的。呵呵不自己做一下真的學不到東西。呵呵雖然可能你以後的志向不想做程序員。都是基礎演算法。面試保證問你。

2. 隨機數演算法是什麼

在計算機中並沒有一個真正的隨機數發生器,但是可以做到使產生的數字重復率很低,這樣看起來好象是真正的隨機數,實現這一功能的程序叫偽隨機數發生器。有關如何產生隨機數的理論有許多如果要詳細地討論,需要厚厚的一本書的篇幅。不管用什麼方法實現隨機數發生器,都必須給它提供一個名為「種子」的初始值。而且這個值最好是隨機的,或者至少這個值是偽隨機的。「種子」的值通常是用快速計數寄存器或移位寄存器來生成的。下面講一講在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......餘下全文>>

3. 隨機數生成方案(計算方法)

諾依曼的平方數取中法。
先通過求關鍵碼的平方值,從而擴大相近數的差別,然後根據表長度取中間的幾位數(往往取二進制的比特位)

4. 電腦中的隨機數是怎麼生成的(硬體方面的原理)

http://ke..com/view/1127.htm

偽隨機數的生成方法
一般地,偽隨機數的生成方法主要有以下3種[6]:
(1) 直接法(Direct Method),根據分布函數的物理意義生成。缺點是僅適用於某些具有特殊分布的隨機數,如二項式分布、泊松分布。
(2) 逆轉法(Inversion Method),假設U服從[0,1]區間上的均勻分布,令X=F-1(U),則X的累計分布函數(CDF)為F。該方法原理簡單、編程方便、適用性廣。
(3)接受拒絕法(Acceptance-Rejection Method):假設希望生成的隨機數的概率密度函數(PDF)為f,則首先找到一個PDF為g的隨機數發生器與常數c,使得f
[偽隨機數發生器]

偽隨機數發生器
(x)≤cg(x),然後根據接收拒絕演算法求解。由於演算法平均運算c次才能得到一個希望生成的隨機數,因此c的取值必須盡可能小。顯然,該演算法的缺點是較難確定g與c。 因此,偽隨機數生成器(PRNG)一般採用逆轉法,其基礎是均勻分布,均勻分布PRNG的優劣決定了整個隨機數體系的優劣[7]。下文研究均勻分布的 PRNG。
隨機數的「廬山真面目」
首先需要聲明的是,計算機不會產生絕對隨機的隨機數,計算機只能產生「偽隨機數」。其實絕對隨機的隨機數只是一種理想的隨機數,即使計算機怎樣發展,它也不會產生一串絕對隨機的隨機數。計算機只能生成相對的隨機數,即偽隨機數。
偽隨機數並不是假隨機數,這里的「偽」是有規律的意思,就是計算機產生的偽隨機數既是隨機的又是有規律的。怎樣理解呢?產生的偽隨機數有時遵守一定的規律,有時不遵守任何規律;偽隨機數有一部分遵守一定的規律;另一部分不遵守任何規律。比如「世上沒有兩片形狀完全相同的樹葉」,這正是點到了事物的特性,即隨機性,但是每種樹的葉子都有近似的形狀,這正是事物的共性,即規律性。從這個角度講,你大概就會接受這樣的事實了:計算機只能產生偽隨機數而不能產生絕對隨機的隨機數。(嚴格地說,這里的計算機是指由馮諾依曼思想發展起來的電子計算機。而未來的量子計算機有可能產生基於自然規律的不可重現的「真」隨機數)。

5. 求各種產生隨機數的演算法

多的很呀!別撤消呀,千萬! 不過幾乎都是偽隨機數。 隨機序列的演算法 找到了兩個演算法, 第一個很簡單, 但可惜不是隨機的, 第二個是典型的偽隨機數演算法, 可惜要用到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了注意 序列控製表.質數 決定了序列的范圍

6. 昨天面試,面試官問了我一題關於偽隨機數的問題。問題大概如下: 通過編程方法實現5個偽隨機數

我在網上查看過一些關於random函數的資料,random函數是跟randimze函數一起使用的。作用跟rand函數和srand函數一樣。
我在linux下,把你的程序該了一下,運行是可以的。我猜random函數是Linux C下的函數,而不是標准C,所以運行會報錯。
下面是修改後的程序:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
// int randomize(); //播種子
srand((unsigned)time(NULL));
int a=0,b=100,t=0,i=0;
a=random()%90; //生成第一個隨機數
t=t+a;
int c=b-a; //限制隨機數的范圍
printf("t=%d ",t);
printf("random1:%2d\n",a);
for(i=2;i<5;i++) //循環為了生成3個的隨機數
{
a=rand()%c;
c=c-a;
t=t+a;
printf("t=%d ",t);
printf("random%d:%2d\n",i,a);
}

a=100-t; //生成最後一個隨機數
printf("t=100 ");
printf("random5:%2d\n",a);

return 0;
}
上面程序雖然能夠執行,但是如果使用"int randomize(); "初始化的時候,運行結果都是一樣的,也就是說沒有達到真正上的隨機。但是用"srand((unsigned)time(NULL));」,結果就是真正上的隨機了。

回答如果可以給點分唄。

7. java怎麼進行隨機數生成演算法

要產生隨機數,可以使用Java api中java.lang包中的Math類.Math類以靜態方法的方式提供常用的數學方法,
其中Math.random()方法是一個可以產生[0.0,1.0]區間內的一個雙精度浮點數的方法
如:
產生一個100以內的整數:int x=(int)(Math.random()*100);
又如:
產生一個1-50之間的隨機數:int x=1+(int)(Math.random()*50)
也可以使用通用創建對象來獲取:
Random random = new Random();
random.nextInt(x);
產生一個0到x-1的正數,如果想產生浮點數有Random類的nextFloat方法,總之nextXXX方法是用來產生隨機數的。

8. 關於數據結構的面試題

有a~z,0~9共36個字元組成的字元串,尤其從中任取兩個字元組成一個新的字元串,不得重復,這樣的字元串一共有:36*35=1260,照你那麼說,即使他讓你寫1000個也應該能夠寫出來。演算法復雜度最小的不好找,這種題能夠寫出來就OK了。別人給我10個數讓我排序,我也不一定就用快速排序啊?

9. c語言中如何生成1個0到1的隨機數

C語言中生成1個0到1的隨機數可以執行語句:float b=rand()/(RAND_MAX+1.0);

解析:

標准C庫中函數rand()可以生成0~RAND_MAX之間的一個隨機數,其中RAND_MAX 是stdlib.h 中定義的一個整數,它與系統有關。rand()函數沒有輸入參數,直接通過表達式rand()來引用;

用函數rand取得的隨機數除以(RAND_MAX+1.0),即可確保得到的結果在0到1之間。ISO IEC 9899 2011 (C11)標准中未規定 RAND_MAX 的具體數值。但該標准規定了RAND_MAX 的值應至少為32767。編程的時候,不應該對 RAND_MAX 的具體數值做任何假設。

(9)隨機數生成演算法面試擴展閱讀:

相關說明:

1、因為rand()函數是按指定的順序來產生整數,因此每次執行上面的語句都列印相同的兩個值,所以說C語言的隨機並不是真正意義上的隨機。

2、為了使程序在每次執行時都能生成一個新序列的隨機值,我們通常通過為隨機數生成器提供一粒新的隨機種子。函數 srand()(來自stdlib.h)可以為隨機數生成器播散種子。只要種子不同rand()函數就會產生不同的隨機數序列。srand()稱為隨機數生成器的初始化器。

3、隨機種子(Random Seed)是計算機專業術語,一種以隨機數作為對象的以真隨機數(種子)為初始條件的隨機數。一般計算機的隨機數都是偽隨機數,以一個真隨機數(種子)作為初始條件,然後用一定的演算法不停迭代產生隨機數。

閱讀全文

與隨機數生成演算法面試相關的資料

熱點內容
安卓手機為什麼換電話卡沒反應 瀏覽:793
諸子集成pdf 瀏覽:336
php注冊框代碼 瀏覽:714
手機加密好還是不加好好 瀏覽:814
別克凱越壓縮機泵頭多錢 瀏覽:239
組管理命令 瀏覽:979
海南高德司機端是什麼app 瀏覽:861
pid命令 瀏覽:888
一天一圖學會python可視化 瀏覽:309
魔獸編輯文本命令串 瀏覽:497
android中view繪制 瀏覽:798
安卓機內存刪除怎麼恢復 瀏覽:331
Qt環境的編譯軟體放到linux 瀏覽:214
聯創列印系統怎麼連接伺服器 瀏覽:937
杭州行政命令 瀏覽:160
如何查找伺服器日誌 瀏覽:801
加密的鑰匙扣怎麼寫 瀏覽:579
文件夾更新不了怎麼辦 瀏覽:475
壓縮機指示燈亮是什麼原因 瀏覽:956
什麼app訂酒店半價 瀏覽:767