生成k個小於n的互不相同的隨機數
阿新 • • 發佈:2019-02-13
《程式設計珠璣》習題1.4:如果認真考慮了習題3,你將會面對生成小於n且沒有重複的k個整數的問題。最簡單的方法就是使用前k個正整數。這個極端的資料集合將不會明顯的改變點陣圖方法的執行時間,但是可能會歪曲系統排序的執行時間。如何生成位於0至n - 1之間的k個不同的隨機順序的隨機整數?儘量使你的程式簡短高效。
如下的程式產生1-n的不重複的隨機數:
上面的演算法複雜度為O(n);void swap(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; } void produce (int a[], int n) { int i; //對陣列a依次賦一個不同的值 for (i = 0; i < n + 1; i++) { a[i] = i + 1; } srand((int)time(0)); //下面的語句用於產生n個不同的隨機數,存於陣列的0到n-1位中 // i + rand() % (n - i)產生一個範圍i到n的隨機數 //那麼將這個下標的陣列資料和以i為下標的陣列資料swap肯定不重複 for (i = 0; i < n; i++) { swap(&a[i], &a[i + rand() % (n - i)]); } }
在文章中,libnids的void init_hash () 函式也提供了一種產生0到11之間不重複隨機數的方法,其複雜度為O(n
^ 2).
參考: