JavaScript算法題之–隨機數的生成

(準備面試,多看點題。來自雨夜帶刀's Bloghtml

需求描述:從一組有序的數據中生成一組隨機而且不重複的數,相似於簡單的抽獎程序的實現。
先來生成一個有序的數組:面試

var arr = [],
length = 100,
i = 0;
for( ; i < length; i++ ){
    arr.push( i );
}

從一個長度爲 100 的有序數組中隨機拿出 10 個隨機的數,而且不能有重複。數組

方法1:隨機抽取法

var gRandomArr = function( arr, length ){
    var newArr = [],
    i = 0,
        index;

    for( ; i < length; i++ ){
        // 利用數組長度生成隨機索引值
        index = parseInt( Math.random() * arr.length );
        // 將隨機索引對應的數組元素添加到新的數組中
        newArr.push( arr[index] );
        // 刪除原數組中隨機生成的元素
        arr.splice( index, 1 );
    }

    return newArr;
};

// 調用
gRandomArr( arr, 10 );

方法1主要是採用基於數組自己的長度去生成隨機的索引值,而後將索引值對應的數組元素添加到隨機數組中,因爲不能有重複,在添加好後將刪除原數組的元素。dom

方法2:隨機打亂原數組的順序,而後再一次性返回

var gRandomArr = function( arr, length ){
    // 使用sort將原數組的順序打亂,讓有序變成無序
    arr.sort(function(){
        return Math.random() - 0.5;
    });

    // 從原數組中一次性返回10個元素
    return arr.slice( 0, length );
};

// 調用
gRandomArr( arr, 10 );

方法2採用的辦法是先打亂原數組的順序,但這裏須要用到 sort 來對原數組進行排序,若是數組長度較大的話,sort 排序的性能損耗會更大,由於須要遍歷整個數組,而隨機抽取的話,不須要對整個數組進行遍歷,故其性能會更好。性能

相關文章
相關標籤/搜索