下屬專案
測試用例數量
問題描述無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 重新實現 實現的思路並沒有...