關(guān)于隨機打亂數(shù)組的深入研究
2006/11/21 9:29:55

這幾天看到網(wǎng)絡(luò)上在討論關(guān)于隨機打亂數(shù)組的問題!發(fā)現(xiàn)很多朋友的都有自己的方法,但是否真正的隨機了呢?這個問題的爭議一直很大,我在總結(jié)后,以及對Array.sort()內(nèi)部構(gòu)造的猜測后發(fā)現(xiàn),還是有很多不是太完美的地方,所以我經(jīng)過思考還是寫了一套關(guān)于自己的數(shù)組隨機打亂的函數(shù),希望與大家分享一下!
好了,言歸正轉(zhuǎn),來看看我們的三個函數(shù),分別是:  randomArray(arrLen) 功能為:產(chǎn)生一個完全隨機的數(shù)組,參數(shù)為數(shù)組的長度.  randomIndex(arrLen) 功能為:根據(jù)參數(shù)產(chǎn)生一個數(shù)組,從0起到長度-1的所有自然數(shù)隨機打亂  randomSort(arr) 功能為:隨機打亂一個數(shù)組中所有值的順序.
首先是隨機數(shù)組,這是最簡單的一個函數(shù),來看一下代碼!
function randomArray(arrLen) {
    var rArr:Array = new Array(arrLen);
    for (var i = 0; i<arrLen; i++) {
        rArr[i] = Math.random();
    }
    return rArr;
}
是不是很簡單,我相信不用過多的解釋!函數(shù)返回的rArr這個數(shù)組里的所有數(shù)都是放射性隨機的,所以將來會很有用的!另外值得說明的就是用Math類產(chǎn)生的隨機數(shù),客觀上是不可能會有任何重復的,因為概率小的幾乎可以完全忽略,即使數(shù)組長度為千百萬以上!
其次我們來看看,建立隨機索引的過程:
function randomIndex(arrLen) {
    var iArr:Array = new Array(arrLen);
    var rArr = randomArray(arrLen);  //建立隨機數(shù)組,以備使用
    for (var i = 0; i<arrLen; i++) {  //遍歷數(shù)組,尋找最小的數(shù)字
        iArr[i] = i;  //默認被比較的數(shù)字為最小數(shù)字,并記錄索引
        var t = rArr[i];  //記錄該數(shù)字在臨時變量中
        for (var j = 0; j<arrLen; j++) {  //與所有數(shù)字進行比較
            if (rArr[j]<t) {  //如果發(fā)現(xiàn)更小的數(shù)字,則更新
                iArr[i] = j;
                t = rArr[j];
            }
        }
        delete t;
        rArr[iArr[i]] = 1;  //將最小的數(shù)字設(shè)置成1.
    }
    return iArr;
}
簡單說一下原理吧:隨機數(shù)組中的所有數(shù)字的大小全是不確定的,相互之間也是不確定的!任何一個數(shù)字都可能最大,也都可能最小,所以每次都會產(chǎn)生不同的序列,那么他們排序后索引就會被完全打亂,由此也起到了真正的隨機效果!值得一提的是其中rArr[iArr[i]]=1;是因為Math.random();不可能出現(xiàn)1,也就是說任何數(shù)都比1小,也保證的1是最大的,那么修改它后,第二次比較的時候就會讓它失去了比較權(quán),因為上一輪它已經(jīng)是最小的數(shù)了,并且已經(jīng)被記錄過了!相反如果語句if(rArr[j]<t)其中的小于號改成大于號,最后的值應(yīng)該設(shè)置成0,同樣可以起到放射性隨機的效果,只是結(jié)果完全相反而已.
現(xiàn)在打亂了所有的索引,最后要做的就是根據(jù)這個完全隨機的索引序列,隨機打亂數(shù)組中所有的值了:
function randomSort(arr) {
    arrLen = arr.length;
    var tArr = new Array(arrLen);  //建立臨時數(shù)組,存放隨機打亂的數(shù)組
    var iArr = randomIndex(arrLen);  //建立隨機索引
    for (var i = 0; i<arrLen; i++) {
        tArr[i] = arr[iArr[i]]; //根據(jù)隨機索引完全打亂數(shù)組中所有的值
    }
    return tArr;
}
用隨機索引函數(shù)產(chǎn)生的數(shù)組作為預(yù)被打亂的數(shù)組的新索引,進行賦值,即完成了完全打亂的效果!
就此對于隨機打亂數(shù)組的研究也進行完了,希望對喜歡的朋友們有些幫助!

返回列表
返回首頁 主站蜘蛛池模板: 泰国午夜理伦三级| 中文精品北条麻妃中文| 男人肌肌捅女人肌肌视频| 国产精品大片天天看片| jizzjizz成熟丰满舒服| 最近中文字幕mv2018免费看| 台湾佬在线观看| 6080yy免费毛片一级新视觉| 日本xxx在线播放| 亚洲jizzjizz妇女| 波多野结衣全部作品电影| 全彩※acg海贼王同人本子| caoporn地址| 国内精品久久久久久久影视麻豆| 久久大香伊蕉在人线观看热2| 欧美成人综合在线| 免费国产美女爽到喷出水来视频| h国产在线观看| 国模吧一区二区| yellow日本动漫高清小说| 手机在线看片你懂的| 动漫美女被爆羞羞免费| 调教15小男生gay脱裤子| 国产日韩精品在线| gdianav| 成人免费在线视频| 亚洲2022国产成人精品无码区| 欧美精品一区二区三区在线 | 国产精品久久久尹人香蕉| 99久久免费看国产精品| 日本肉漫在线观看| 亚洲一区二区三区在线观看网站| 欧美精品一区二区三区在线| 亚洲自国产拍揄拍| 男男暴菊gay无套网站| 午夜体验试看120秒| 翁情难自禁无删减版电影| 国产欧美日韩精品丝袜高跟鞋| √天堂中文官网8在线| 成人影院久久久久久影院| 亚州av综合色区无码一区|