(準備面試,多看點題。來自雨夜帶刀's Blog)html
需求描述:從一組有序的數據中生成一組隨機而且不重複的數,相似於簡單的抽獎程序的實現。
先來生成一個有序的數組:面試
var arr = [], length = 100, i = 0; for( ; i < length; i++ ){ arr.push( i ); }
從一個長度爲 100 的有序數組中隨機拿出 10 個隨機的數,而且不能有重複。數組
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
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 排序的性能損耗會更大,由於須要遍歷整個數組,而隨機抽取的話,不須要對整個數組進行遍歷,故其性能會更好。性能