生成不重複的隨機數的方法

2021-09-08 09:47:52 字數 648 閱讀 6571

《程式設計珠璣》有一題,需要生成0~10^7的不重複隨機數。

最簡單最直接的方法是,每次生成乙個,然後和已經生成的進行比較,如果有了,那就重新生成。但乙個顯然的事實是,如果我要產生很多的數,越到後面所要花費的時間將越多。

如何又快又好的產生呢?

我們可以換個角度考慮問題,每次隨機產生的可以不是具體的數,而是數在陣列中的位置。演算法的示意圖如下:

#define maxint (10000000)

void myswap(int &a,int &b);

void getrandoms(int

k);

void myswap(int &a,int &b)

void getrandoms(int

k)

for(i=(maxint-1);i>=(maxint-k);i--)

if((fp=fopen("

data.dat

","w+b

"))==null)

fwrite(allint+maxint-k,sizeof(int

),k,fp);

fclose(fp);

free(allint);}

int main(int argc, char*ar**)

生成不重複的隨機數

思想是用乙個陣列來儲存索引號,先隨機生成乙個陣列位置,然後把這個位置的索引號取出來,並把最後乙個索引號複製到當前的陣列位置,然後使隨機 數的上限減一,具體如 先把這100個數放在乙個陣列內,每次隨機取乙個位置 第一次是1 100,第二次是1 99,將該位置的數用最後的數 代替。int index n...

不重複隨機數生成

直接上 生成 0,total 的隨機數 最大隨機數 ilist private static ilistgetrandomsequence int total random random new random for var i listbase.count 1 i 0 i return listo...

C 生成不重複的隨機數

在做洗牌演算法的時候用到了隨機數,並且產生的隨機數中不能有重複的元素,因為是用c語言實現的,就把值賦給陣列,然後用隨機數產生陣列的下標,每產生乙個就刪除對應的元素,然後隨機數的生成範圍減一,但是這樣做每次都要迴圈去移動陣列元素,從時間複雜度上來說這樣並不好。於是,後來用c 重新實現 實現的思路並沒有...