JavaScript 產生不重複的隨機數三種實現思路

在 JavaScript 中,一般產生的隨機數會重複,但是有時我們需要不重複的隨機數,如何實現?下面就來講解三種方法產生不重複的隨機數,並進行比較,看那種方法效率高。

方法一 
思路:首先創建一個1到3000的數組,每次取一個數,然後去除數組中取出的這個數, 這樣就可以實現永不重複。 

var count=3000; 
var originalArray=new Array;//原數組 
//給原數組originalArray賦值 
for (var i=0;i<count;i++){ 
    originalArray[i]=i+1; 
} 
var d1=new Date().getTime(); 
for (i=0;i<count;i++){ 
    var index=Math.floor(Math.random()*originalArray.length); //隨機取一個位置 
    document.write(index+" , "); 
    originalArray.splice(index,1); 
} 
var d2=new Date().getTime(); 
document.write("運算耗時"+(d2-d1)); 


性能:耗時 1528 毫秒。 

方法二 
思路:對方法一的slice方法進行改進,以提高效率。還是從原數組取出一個數, 然後讓原數組的這個位置賦值爲null 。下一次取數時判斷是否爲null,如果是null就不取。 

var count=3000; 
var originalArray=new Array;//原數組 
//給原數組originalArray賦值 
for (var i=0;i<count;i++){ 
    originalArray[i]=i+1; 
} 
var d1=new Date().getTime(); 
for (var num,i=0;i<count;i++){ 
  do{ 
    num=Math.floor(Math.random()*count); 
  }while(originalArray[num]==null); 
    document.write(originalArray[num]+" , "); 
    originalArray[num]=null; 
} 
var d2=new Date().getTime(); 
document.write("運算耗時"+(d2-d1)); 


性能:耗時 290 毫秒。 

方法三 
思路:把原數組打散,然後再依次輸出, 這樣也可以做到隨機永不重複,且效率更高。 

var count=3000; 
var originalArray=new Array;//原數組 
//給原數組originalArray賦值 
for (var i=0;i<count;i++){ 
    originalArray[i]=i+1; 
} 
var d1=new Date().getTime(); 
originalArray.sort(function(){ return 0.5 - Math.random(); }); 
for (var i=0;i<count;i++){ 
    document.write(originalArray[i]+" , "); 
} 
var d2=new Date().getTime(); 
document.write("運算耗時"+(d2-d1)); 

原文鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章