給定乙個正整數n,需要輸出乙個長度為n的陣列,陣列元素是隨機數,範圍為0 – n-1,且元素不能重複。比如 n = 3 時,需要獲取乙個長度為3的陣列,元素範圍為0-2。
首先,讓我們先構造如下函式:
[cpp]view plain先給序列a[0...n-1]賦值,a[i]=i;(0=偽**如下:copy
//隨機數生成函式,生成[a,b]之間的乙個隨機數字
//其中0<=aint random(int a,int b)
[cpp]view plain分析:顯然解法一無法準確的確保p中元素無重複,且當n較大時,n的三次方會很大,如當n=10000時,n的三次方已經超出了無符號長整形的表示範圍。該演算法時間複雜度依賴排序時間,且這個排序不好實現。總之,這不是乙個很好的隨機序列生成演算法。copy
n=length[a]
for(i=0;ip[i]=random(0,n^3);
sort a,using p as sort keys
先給序列a[0...n-1]賦值,a[i]=i;(0=然後原地排列給定序列。**如下:
[cpp]view plain分析:這個演算法的時間複雜度為o(n)。copy
//產生隨機序列
void randomsequence1(int *a,int n)
}
這是在網上看的一種高效隨機生成序列演算法,詳細請看原文:
這裡給出自己寫的**:
[cpp]view plaincopy
//產生隨機序列
void randomsequence2(int *a,int n)
}
參考書籍:《演算法導論》 解法三原文:
隨機數生成演算法
看到一些介紹隨機數生成演算法的文章,收集下來,有空深入了解下。c語言中偽隨機數生成演算法實際上是採用了 線性同餘法 具體的計算如下 xi xi 1 a c mod m 其中a,c,m都是常數 一般會取質數 當c 0時,叫做乘同餘法。srand 函式置的seed實際上會作為x0被代入上式中,然後每次呼...
隨機數生成演算法
這兩天沒事,就寫了寫數學課上老師說的那個 蒲豐投針實驗 的程式。接觸到了一些隨機數生成方面的東西,寫出來跟大家分享一下。對於計算機生成隨機數這個東西,以前有過一些淺顯的認識。只知道計算機不能生成真正的隨機數,只能用一定的方法來模擬隨機數,叫做偽隨機數。比如c語言裡面的rand 函式,就是乙個偽隨機數...
隨機迷宮生成演算法整理分析
蒐集整理了一些遊戲迷宮生成的演算法與實現 前段時間學校遊戲開發課大作業,做了乙個roguelike的恐怖遊戲。蒐集整理了一些迷宮生成的演算法。當初也受了indienova上一些文章的啟發。現在在此把學到的一些東西理一理分享出來。第一次寫這種東西,感覺有點囉嗦,還請大家不要介意,也可以直接看專案位址 ...