關于隨機打亂數組的深入研究
2006/11/21 9:29:55

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

返回列表
返回首頁 主站蜘蛛池模板: 欧美欧洲性色老头老妇| 中文字幕在线看视频一区二区三区 | 成人深夜福利在线播放不卡| 九九视频在线观看视频23| 欧美综合第一页| 免费一级特黄特色大片在线| 老外毛片免费视频播放| 国产成人av在线免播放观看| 2019亚洲午夜无码天堂| 天天操天天操天天操| 中文字幕久久综合| 日本边添边摸边做边爱边视频| 亚洲中文精品久久久久久不卡| 深夜放纵内射少妇| 再深点灬舒服灬免费观看| 色九月亚洲综合网| 国产午夜av秒播在线观看| 亚洲制服欧美自拍另类| 国产色综合天天综合网| a级毛片无码免费真人| 怡红院成人在线| 中文字幕第23页| 日本护士69xxxx免费| 乱中年女人伦av一区二区| 欧美在线精品一区二区在线观看| 亚洲精品成人a在线观看| 白嫩少妇喷水正在播放| 午夜无码伦费影视在线观看| 色综合久久伊人| 国产另类TS人妖一区二区| 免费福利在线观看| 国产精品久久久久久网站| 911香蕉视频| 在线免费观看一区二区三区| ntr出差上司灌醉女职员电影| 成人免费一区二区三区视频| 中文字幕亚洲综合久久| 无码人妻一区二区三区免费n鬼沢| 久久午夜夜伦鲁鲁片免费无码影视 | 亚洲成综合人影院在院播放| 波多野结衣gvg708|