我知道这个问题是在许多伪装周围,但我一直没能找到一个有关我的具体问题的效率的答案。Javascript:如何有效地随机选择数组项没有重复
我有下面的代码,工作得很好。
我有一个10项数组,从中随机选择一个项目(在输入按键上)。该代码保留了最近5个不能随机选择的选项(以避免随着时间的过去重复)。
如果chooseName()函数最初选择最近使用过的名称,它会简单地中断并重新调用自身,直到找到“唯一”名称为止。
我有两个问题:
难道是正确的说这是一种“递归函数”?
我很担心,理论上这可能会在找到一个独特的名称之前保持循环很长时间 - 是否有更高效的方法来执行此操作?
谢谢你的帮助。
var a = ["Roger", "Russell", "Clyde", "Egbert", "Clare", "Bobbie", "Simon", "Elizabeth", "Ted", "Caroline"];
var b = [];
var chooseName = function() {
var unique = true;
b.length = 5;
num = Math.floor(Math.random() * a.length);
name = a[num];
for (i = 0; i < a.length; i++) {
if (b[i] == name) {
chooseName();
unique = false;
break;
}
}
if (unique == true) {
alert(name);
b.unshift(name);
}
}
window.addEventListener("keypress", function (e) {
var keycode = e.keyCode;
if (keycode == 13) {
chooseName();
}
}, false);
一旦选择了它,创建数组的临时副本并从中简单地移除元素会怎样?当临时数组为空时 - 重新创建它。通过这种方式,您将永远不会重复,直到数组被删除 –
当您从数组中选择一个项目时,请将其删除,以免再次选中它,并将其添加到所选项目的数组中。当数组大于5时,将最老的数组添加回原始数组,以便可以再次选择它。 – Barmar