非重複隨機序列的高效生成(C語言)

2021-08-14 12:46:35 字數 1166 閱讀 4751

下屬專案

測試用例數量

問題描述無0

思想+程式無1

有乙個長度為n的序列,現在要你把它全部打亂順序,生成乙個隨機的序列

思路1:

生成隨機數,要交換的序號=隨機數%長度

判斷要交換的序號是否已經被交換過,若交換過則跳回步驟1重新生成隨機數,若沒有交換過則交換後再跳回步驟1,直至所有的序號都被交換過

思路2:

第 i 次(i 從0開始且每次遞增1)生成隨機數,要交換的序號=隨機數%(長度- i )

交換序號 i 和 步驟1中「要交換的序號」,直至 i 遞增到了序列末尾

通常情況下我們會想到思路1,但當n非常大時,生成的隨機數%長度 得到的序號很有可能是已經交換過的序號,導致效率很低。

而思路2通過巧妙的固定規律交換,即序號 i 是有規律遞增的,而另乙個要交換的序號是序列中序號 i 之後的任意乙個隨機序號,同樣實現了隨機性,且保證了時間複雜度為o(n),十分高效!

同樣是交換,秘訣在於交換的法則。

#include

#include

#define n 10

void

swap

(int

*a,int i,

int j)

void

main()

;for

(i =

0; i < n; i++

) a[i]

= i +1;

for(i =

0; i < n; i++

)//交換a[i]和a[i]後面的隨機序號

swap

(a, i, i +

rand()

%(n - i));

for(i =

0; i < n; i++

)printf

("%d "

, a[i]);

system

("pause");

}

可以看到**部分也十分簡潔1

如果本文對你有幫助,不如請我一罐可樂吧 ?

問題描述

思想+程式

問題源於一次面試,同時感謝前輩的點撥. ↩︎

如何高效的生成不重複的隨機數

背景 有個存有1000個問題的題庫,用陣列numhastack存,現要從中隨機生成5道題。如果直接用隨機數生成函式rand 然後把生成的題號存到陣列numgenerate中,會產生重複出現的問題。參考我原來的博文 1.最直接的解決辦法 每隨機生成乙個數,就拿到陣列numgenerate中比較,如果存...

C 隨機生成不重複亂數

標頭檔 include include include 方法一 陣列依序生成亂數,並且在生成的過程中使用迴圈比對之前是否使用過此數,若有則重新生成比較 int main 若num j 1 比較到num i 1 都沒有重複,代表這個亂數是新的可以使用,並且for結束時j i,因此在下一行判斷跳出do ...

C 生成不重複的隨機數

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