之前有项目要用类似的功能,想随机从一些数据里抽取一些完全不相同的数据,想了一个这个逻辑,于是就写了个例子,如下:
var sa = []; var len = 15; for(var i=0;i<len;i++){ sa.push(i); } for(var i=0;i<10;i++){ //alert('剩下的长度:----'+sa.length); var rate = parseInt(Math.random()*sa.length); //alert('命中的key----'+rate); var subs = sa.splice(rate,1); //alert('命中的value---'+subs+'---typeof:'+typeof(subs)); } alert('最后剩余:---'+sa.join(','));
可以看出,最核心的地方就是splice函数
以下是jk推荐的算法:
这是一个典型的抽牌算法。
抽牌算法与洗牌算法推荐如下:
1 function getRandomArray(m,n) //得到m张牌里的n张牌 (m>=n>0)
2 {
3 if(n==null || n==m )
4 return getRandomPlayCard(m);
5 var array1=new Array(m);
6 for(var i=0;i<m;i++)
7 array1[i]=i;
8 var m2=m-0.001;
9 for(var i=0;i<n;i++)
10 {
11 var rnd=Math.floor(Math.random()*m2);
12 var swap=array1[i];array1[i]=array1[rnd];array1[rnd]=swap;
13 }
14 return(array1.slice(0,n));
15 }
16
17 function getRandomPlayCard(m) //洗牌
18 {
19 var array1=new Array(m);
20 for(var i=0;i<m;i++){
21 var rnd=Math.floor(Math.random()*(i+0.999))
22 array1[i]=array1[rnd];
23 array1[rnd]=i;
24 }
25 return array1;
26 }
27
28 document.write(getRandomPlayCard(100)+"<br><br>"+getRandomArray(100,5));