還有更簡單的不重復隨機數生成方法嗎?


  這是一個關於javasript的問題。

  偶然間想到一個我們經常會用到的東西,生成一組不重復的隨機數(比如:生成10個小於32的隨機數,不能重復。)。在C#中這壓根就不是什么問題,一個contains就能判斷一個元素是否在數組中存在,但是到了js里沒有一個簡單的方式可以判斷某個值是否在數組中是否已經存在。既然沒找到相關的函數就只能想想辦法了。那是循環呢?還是循環呢?循環?循環?.......

  想了很久,最終想到了這樣的一個方法:

  首先利用js對象來判斷新的隨機數是否已經存在過了。如果沒有再加入到對象到屬性中和結果數組中。貼上代碼:

 1 function getNo() {
 2     var res = {}, rleng = [];
 3 
 4     while (rleng.length < 10) {
 5         var n = Math.round(Math.random() * 31);
 6         if (res[n]) {
 7             continue;
 8         }
 9         res[n] = n;
10         rleng.push(n);
11     }
12     return rleng;
13 }

雖然js沒有直接可以判斷某個元素是否在數組中存在的方法,但可以簡單的判斷某個屬性是否在某個對象中存在。呵呵~,取了個巧。

其實除此之外還有另外的一種方法:

 1 function getNos()
 2 {
 3     var str="",res=[];
 4     while (res.length < 10) {
 5         var n = Math.round(Math.random() * 31);
 6         if (str.indexOf("["+n+"]")) {
 7            res.push(n);
 8             str+="["+n+"],";
 9         }
10     }
11     return res;
12 }

兩個方法大致思路上都差別不大,一個是利用對象,一個是字符串。(感謝細心的朋友提出寶貴的意見,這里加上[]防止indexof在類似12和2這樣多情況下出現bug)。

 

下面是@double Net過客沖沖的方法,這是一種很科學的方法!(悄悄的改造了下):

  

 1 var getUnique=function(min,max,count){
 2     var arr=[];
 3     for(var i=min;i<max;i++){
 4         arr.push(i);
 5     }
 6     arr=arr.sort(function(l,r){
 7         return Math.random()>Math.random();
 8     });
 9     return arr.slice(0,count);
10 };


//getUnique(1,20,5)
//[10, 1, 3, 16, 5]

 

 

javascript小白,只能想到這里了。如果您有更簡單,更有效的方法嗎?請帖出來吧。

(@轉載請注明出處:http://www.cnblogs.com/aser1989/p/4991530.html)

 

 

 

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM