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

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

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

    彩票選號后的數學——抽牌算法的實現

    中國的彩票選號,例如36選7,從36個數字中隨機選取7個,這在算法上如何實現呢?

    最簡單的想法就是,每次都從1~36隨機選取一個數,一共選7次,不就可以了嗎?
    但這樣會有一個問題——重復。彩票選號是不能重復的,這也即是說如果你第一次選到的數是10,那么以后再從1~36中選數的時候,10就不能再選了。
    有人可能會說了,這還不好辦,如果重復了就廢掉,重新再選一個唄。
    這的確是一種解決方法,但是會有很大的問題,比如說5選4吧,前三個都已經選好了是2,3,4,現在取第4個數,這種情況下,取到1和5的幾率要比取到2,3,4的幾率還要小,也就是說,最壞的情況下,有可能會取很多次2,3,4,扔掉很多次,才最終能取到1或5,完成4個隨機數字的選擇。顯然,這樣效率是有很大問題的。

    下面就介紹一種算法:抽牌算法,來實現這種不允許重復的選號,同時不會出現這種效率上的問題。
    [separator]
    抽牌算法的核心思想如下:
    以36選7為例
    一副牌,一共36張,抽出其中一張牌,放到一邊,再從剩下的牌中抽出第二張,放到一邊……以此類推,直到抽完了7張牌為止。
    很顯然,這樣抽牌是絕對不會重復的。而其核心就是抽出的牌要放到一邊

    用算法如何實現呢?
    其實很簡單,只要能模擬實現把抽出的牌放到一邊這個概念就可以了,而模擬實現的方法是非常簡單的:把一個數組模擬成一個牌盒,用數組里存的數模擬牌,而抽出的牌放到一邊的動作,只需進行一次數組交換,把它放到數組的末尾即可。

    以36選7為例
    初始化數組,其結構為[1,2.....35,36]
    第一輪,從1~36序號中選取隨機序號,抽取到序號7, 把序號7和序號36的值交換,7放到數組的末尾,數組結構變成[1...6,36,8......34,35,7]
    第二輪,從1~35序號中選取隨機序號,抽取到7(這時位置7所存的數就是36了),把36和35交換,數組結構就變成了[1..6,35,8...34,36,7]
    第三輪,從1~34序號中選取隨機序號,抽取到5,把5和34交換,數組結構變成了[1...4,34,6,35,8....5,36,7]
    ...
    每一次,都把抽出的“牌”放到數組的最后,然后再抽牌時,就不抽最后那張牌,這樣就實現了抽出的牌放到一邊這樣一個概念。

    請看以下Java代碼:
    Java code
    //獲得不重復的隨機數數組,取值范圍[min,max),個數size public static int[] getRandomIntWithoutReduplicate( int min, int max, int size ) { int[] result = new int[size];//用于存儲結果的數組 int arraySize = max - min;//用于放"牌"的數組大小 int[] intArray = new int[arraySize];//用于放"牌"的數組 // 初始化"牌盒",比如取值范圍是[3,10)則"牌盒"里放的"牌"就是3,4,5,6,7,8,9 for( int i = 0 ; i < intArray.length ; i++ ) { intArray[i] = i + min; } // 獲取不重復的隨機數數組 for( int i = 0 ; i < size ; i++ ) { int c = getRandomInt( min, max - i );//獲取到一個隨機數 int index = c - min;//這個隨機數在"牌盒"里的位置 swap( intArray, index, arraySize - 1 - i );//將這張"牌"放到"牌盒"的最后面 result[i] = intArray[ arraySize - 1 - i ];//把這張"牌"的值扔到存儲結果的數組里 } return result; } //獲取隨機數,隨機數取值范圍為[min, max) public static int getRandomInt( int min, int max ) { // include min, exclude max int result = min + new Double( Math.random() * ( max - min ) ).intValue(); return result; } private static void swap( int[] array, int x, int y ) {//交換數組arry, 序號x與序號y值的順序 int temp = array[x]; array[x] = array[y]; array[y] = temp; }

    posted on 2009-10-27 21:25 甜菜侯爵 閱讀(343) 評論(0)  編輯  收藏


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


    網站導航:
     
    <2009年10月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    常用鏈接

    留言簿

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产色爽女小说免费看| 国产又黄又爽胸又大免费视频| 91av免费观看| 久久精品国产亚洲AV麻豆王友容| 国产亚洲精品免费视频播放| 日韩精品亚洲aⅴ在线影院| WWW国产成人免费观看视频| 亚洲区日韩区无码区| 99在线免费观看| 免费人成网上在线观看| 国产hs免费高清在线观看| 国产成人亚洲毛片| 亚洲国产精品综合久久网络 | 无码人妻精品中文字幕免费东京热| 亚洲国产精品VA在线看黑人 | 亚洲av鲁丝一区二区三区| 久久久久噜噜噜亚洲熟女综合| 婷婷精品国产亚洲AV麻豆不片| 国产在线观看xxxx免费| 亚洲AV永久无码精品一百度影院| 99精品视频在线视频免费观看| 亚洲国产中文在线视频| 最新国产乱人伦偷精品免费网站 | 亚洲国产精品成人综合色在线婷婷| 色费女人18女人毛片免费视频| 亚洲日本一区二区三区在线不卡| 久久久久久国产a免费观看不卡 | 午夜免费啪视频在线观看| 久久久久久亚洲精品成人| 99久久免费精品国产72精品九九| 国产亚洲精品美女久久久久| 亚洲一区二区精品视频| 亚洲电影免费在线观看| 亚洲人成网站色在线观看| 亚洲精品WWW久久久久久| 91麻豆国产免费观看| 色偷偷亚洲第一综合网| 国产国拍亚洲精品mv在线观看| 色窝窝免费一区二区三区| 亚洲网红精品大秀在线观看| 午夜小视频免费观看|