var result = [];
var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14];
var len = arr.length;
while(result.length < 10){
var idx = parseInt(Math.random()*1000)%len ;
if(arr[idx]){
result.push(arr[idx]);
arr[idx] = undefined;
}
}
var arr=[1,2,3,4,5,6,7,8,9,10,11,12,13,14];
var myarr=[];
for(var i=0;i<10;i++){
var idx=parseInt(Math.random()*arr.length)
myarr.push(arr[idx])
arr.splice(idx,1)
}
function getTenNum(n) {
var reslut = [];
var testArray = [1,2,3,4,5,6,7,8,9,10,11,12,13,14];
for (var i = 0; i < n; ++i) {
var random = Math.floor(Math.random() * testArray.length);
reslut.push(testArray[random]);
testArray.splice(random,1);
}
return reslut;
}
var resArr = getTenNum(10);
这个 应该 是大多数人的 代码
性能确实不如 @边城 的方法,我再添加一个性能更差但是简单的。
业余前端选手,从来不考虑性能。。。
来试试这个
来张某次运行示意图
循环次数少,还可以统计数组的重复元素等
这个方法可以用于
数组去重,统计数组中出现最多的元素个数,输出tmp数组里面可以得出,需要什么输出什么就行了用lodash库,或underscore库
var _ = require("underscore");
var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14];
var newArr = _.shuffle(arr);
console.log(newArr.slice(0,10));
console.log(newArr.slice(0,10).length);
思路很简单啊,就好比你现在手里有14个数字,你就从里面拿呗,拿走了一个之后肯定就少一个了。
这样怎么拿都是不重复的啊。
可以用堆栈啊 将数组存储在堆栈里面,pop和push都是随机的就行。随机方法可以取随机数然后对2取余。
可以对前10个元素进行遍历,随机选取十个前十个之后的元素,进行交换,最后截取前十个元素就可以了
复杂度:
O(10)
1、按下标找到第一个;
2、将此下标和最后一个交换;
3、在总长度-1中查找下一个;
4、将此下标和倒数第二个交换;
...
5、重复四次;
6、该数组前十个及所需;