1. 程式人生 > >生成k個小於n的互不相同的隨機數

生成k個小於n的互不相同的隨機數

《程式設計珠璣》習題1.4:如果認真考慮了習題3,你將會面對生成小於n且沒有重複的k個整數的問題。最簡單的方法就是使用前k個正整數。這個極端的資料集合將不會明顯的改變點陣圖方法的執行時間,但是可能會歪曲系統排序的執行時間。如何生成位於0至n - 1之間的k個不同的隨機順序的隨機整數?儘量使你的程式簡短高效。

如下的程式產生1-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)]);
	}
}
上面的演算法複雜度為O(n);

在文章中,libnids的void init_hash () 函式也提供了一種產生0到11之間不重複隨機數的方法,其複雜度為O(n ^ 2).

參考: