<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
    這個需求應(yīng)該是很常見的吧,需要從 0 到 n 之間選 k 個不重復(fù)的數(shù)組成一個序列。

    我最早遇到這個問題是在給校ACM比賽出題時,需要隨機產(chǎn)生一些測試數(shù)據(jù),當(dāng)時我想的是用一個輔助數(shù)組記錄之前已經(jīng)產(chǎn)生的隨機數(shù),如果當(dāng)前產(chǎn)生的隨機數(shù)已經(jīng)出現(xiàn)過就再重新隨機

    顯然這樣的實現(xiàn)效率是很低的,設(shè)想從10000個數(shù)隨機產(chǎn)生10000個數(shù)的序列,當(dāng)前面9999個數(shù)已經(jīng)確定了時,最后一個數(shù)隨機到的概率是 0.0001,也就是說大概需要調(diào)用隨機函數(shù)10000才會產(chǎn)生。類似的,第9999個數(shù)隨機到的概率是0.0002……
    .....

    我后來采用了一個改進的辦法是,如果當(dāng)前產(chǎn)生的隨機數(shù)a已經(jīng)在之前產(chǎn)生過了,就順序去找比a小的數(shù),直到找到一個之前沒有產(chǎn)生過的數(shù),如果找不到就找比a大的數(shù)

    可以看到這樣的改進節(jié)省了大量的時間,但是這樣產(chǎn)生的已經(jīng)不是隨機數(shù)序列了!

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

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

    直到今天在《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)產(chǎn)生一個 a 到 b 之間的隨機數(shù),swap(a,b)交換a和b的值,out(a)把a輸出作為結(jié)果。
    我們來看看這個算法的完美之處吧!

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

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

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


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


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

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

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲人成电影福利在线播放| 波多野结衣免费视频观看| 99久久这里只精品国产免费| 成年女人18级毛片毛片免费观看| 日韩免费无码一区二区视频| 亚洲精品国产综合久久一线| 亚洲国产精品成人精品无码区| 亚洲欧洲日本精品| 亚洲欧美日韩中文字幕在线一区| 国产亚洲精品美女| 久久久精品免费国产四虎| 亚洲w码欧洲s码免费| 日本特黄特色aa大片免费| 国产亚洲精品国看不卡| 亚洲美女色在线欧洲美女| 亚洲国产精品成人综合色在线| 国产精品免费αv视频| 亚洲免费在线视频观看| 四虎影在线永久免费四虎地址8848aa| 亚洲中文字幕无码不卡电影| 亚洲成a人片毛片在线| 免费国产高清毛不卡片基地| 亚洲国产精品免费视频| 免费毛片在线播放| 亚洲阿v天堂在线| 亚洲国产精品无码观看久久| a在线观看免费网址大全| 成人片黄网站A毛片免费| 国产综合精品久久亚洲| 色偷偷女男人的天堂亚洲网| AAAAA级少妇高潮大片免费看| 美女视频黄a视频全免费| 国产亚洲成归v人片在线观看| 亚洲AV无码乱码在线观看代蜜桃 | 久久精品一区二区免费看| 成年女人男人免费视频播放| 亚洲码国产精品高潮在线| 亚洲精品GV天堂无码男同| 免费的全黄一级录像带| 国产男女猛烈无遮挡免费视频网站| 久久久久亚洲精品美女|