<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-159  評論-114  文章-7  trackbacks-0
    這個需求應該是很常見的吧,需要從 0 到 n 之間選 k 個不重復的組成一個序列。

    我最早遇到這個問題是在給校ACM比賽出題時,需要隨機產生一些測試數據,當時我想的是用一個輔助數組記錄之前已經產生的隨機,如果當前產生的隨機已經出現過就再重新隨機

    顯然這樣的實現效率是很低的,設想從10000個隨機產生10000個的序列,當前面9999個已經確定了時,最后一個隨機到的概率是 0.0001,也就是說大概需要調用隨機函數10000才會產生。類似的,第9999個隨機到的概率是0.0002……
    .....

    我后來采用了一個改進的辦法是,如果當前產生的隨機a已經在之前產生過了,就順序去找比a小的,直到找到一個之前沒有產生過的,如果找不到就找比a大的

    可以看到這樣的改進節省了大量的時間,但是這樣產生的已經不是隨機序列了!

    試想從1,2,3,4中隨機挑選2個,假如第一次選出來的是3,那么第二再選的話,選中2的概率就變成了1/2,因為當隨機出來的為2或3時,我們都選擇2。

    在我遇到的應用中,因為對隨機序列的“隨機性”要求不是很高,所以湊合著用了上述辦法。

    直到今天在《Programming pearls》里看到這個很完美的辦法:
    for(i = 0; i < n; i++)
    {
    x[i] = i;
    }
    for(i = 0; i < k; i++)
    {
    t = rand(i,n-1);
    swap(x[i], x[t]);
    out(x[i]);
    }

    其中,rand(a,b)產生一個 a 到 b 之間的隨機,swap(a,b)交換a和b的值,out(a)把a輸出作為結果。
    我們來看看這個算法的完美之處吧!

    首先,x數組里把0到n-1的所有都存儲了,而最后輸出的都是x數組里的值,所以滿足輸出的是k個0到n-1的

    然后,我們對于第 i 隨機,產生一個 i 到 n-1 的下標 t ,并把x[t] 和x[i]交換,將其輸出,這樣每產生的都是之前沒有出現過的,因為之前出現過的都在x[0] 到 x[i-1]里呢!這樣就保證了輸出數據的不重復性。

    最后,我們考察輸出數據的“隨機性”,顯然,因為交換操作,使得所有沒有出現過的都在x[i] 到 x[n-1]中存著呢,所以被選中的概率相等。


    寫完上面這些文字之后,我在想,這樣經典的算法,應該是早就已經出現了,但是我竟然還不知道,這樣看來,我百度實習面試遭鄙視也就是很自然的了,這也算是我之前的一個毛病,喜歡遇到問題才去想怎么解決,沒問題就很少看相關的書或資料,而對于自己能解決的問題(比如上面說的這個湊合著能用的問題),我又懶得去找更好的甚或是標準的解決方法,所以才造成了我現在的知識局限,以后要多看書,多想問題,盡量多的積累知識吧……


    posted on 2010-02-21 14:21 北國狼人的BloG 閱讀(4137) 評論(1)  編輯  收藏

    評論:
    # re: 高效產生一組不重復的隨機數 2013-08-12 18:11 | ll
    要是要求產生的隨機數量特別大怎么辦啊  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 日日噜噜噜噜夜夜爽亚洲精品| 亚洲av无码片在线观看| 国产免费毛不卡片| 国产午夜无码片免费| 亚洲精品乱码久久久久久蜜桃图片| 国产AV无码专区亚洲AV毛网站| 日本大片在线看黄a∨免费| 18观看免费永久视频| 三级黄色免费观看| 无忧传媒视频免费观看入口| 7777久久亚洲中文字幕| 精品亚洲成a人片在线观看少妇| 久久久久亚洲av毛片大| AV大片在线无码永久免费| 免费黄网站在线观看| 一级毛片在线免费视频| 精品国产亚洲一区二区三区在线观看| 精品亚洲成a人片在线观看少妇| 亚洲AV无码一区二区二三区入口| 亚洲国产a级视频| 成人免费无码精品国产电影| 成人无码区免费A片视频WWW| 18禁黄网站禁片免费观看不卡| 久久精品无码精品免费专区| 一本大道一卡二大卡三卡免费| 精品免费AV一区二区三区| 最新亚洲卡一卡二卡三新区| 亚洲剧场午夜在线观看| 在线免费观看亚洲| 久久精品亚洲综合专区| 亚洲AV无码成人精品区在线观看| 亚洲日韩精品无码一区二区三区 | 亚洲色图黄色小说| 亚洲国产香蕉碰碰人人| 亚洲av无码av制服另类专区| 亚洲AV无码专区国产乱码4SE| 久久精品a亚洲国产v高清不卡| 亚洲综合一区二区国产精品| 亚洲五月六月丁香激情| 亚洲电影唐人社一区二区| 亚洲成AV人片久久|