【发布时间】:2017-09-21 22:08:01
【问题描述】:
我有一个包含 10 个数字的数组:
var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
我编写了一个函数(如下)来从数组中返回一个随机元素,而不重复返回相同的元素,直到返回 8 个其他元素。它可以工作,但似乎效率很低,因为随机数生成器通常需要多次调用才能继续代码。有没有更有效的方法来实现相同的结果?
var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var recentlyReturned = [];
function minimalRepeat() {
var i = Math.floor(Math.random() * 10);
while( recentlyReturned.indexOf(i) != -1 ) {
i = Math.floor(Math.random() * 10);
}
recentlyReturned.push(i);
while(recentlyReturned.length>8) {
recentlyReturned.shift();
}
return array[i];
}
for(var i=1; i<20; i++) {
console.log(minimalRepeat());
}
* 编辑 *
我根据 Tudor Ilisoi 的反馈重写了代码。它肯定更有效率。但是,有可能在 shuffle 边界上重复。
版本 2:
function shuffle(arr) {
var copyArr = arr.slice();
for (let i = copyArr.length; i; i--) {
let j = Math.floor(Math.random() * i);
[copyArr[i - 1], copyArr[j]] = [copyArr[j], copyArr[i - 1]];
}
return copyArr;
}
var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var b = shuffle(a);
for(var i=1; i<20; i++) {
if(b.length == 0) {
b = shuffle(a);
}
console.log(b.pop());
}
【问题讨论】:
标签: javascript algorithm random