我知道这个问题有很多种,但是我还没有找到与我的效率问题相关的答案。我有下面的代码可以正常工作。我有一个10个项目的数组,可以从中随机选择一个项目(按Enter键)。该代码包含不能随机选择的5个最近选择的数组(以避免随着时间的推移而重复过多)。如果ChooseName()函数最初选择了最近5次使用的名称,它只会中断并再次调用自身,重复进行直到找到“唯一”名称。我有两个问题:说这是“递归函数”是否正确?我担心从理论上讲,这可能会持续很长时间才能找到唯一的名称-是否有更有效的方法?感谢您的任何帮助。 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);
3 回答
ABOUTYOU
TA贡献1812条经验 获得超5个赞
我喜欢评论者@YuriyGalanter的想法,即随机选择所有项目,直到所有项目都被提取,然后再重复,所以这里是一个实现:
function randomNoRepeats(array) {
var copy = array.slice(0);
return function() {
if (copy.length < 1) { copy = array.slice(0); }
var index = Math.floor(Math.random() * copy.length);
var item = copy[index];
copy.splice(index, 1);
return item;
};
}
var chooser = randomNoRepeats(['Foo', 'Bar', 'Gah']);
chooser(); // => "Bar"
chooser(); // => "Foo"
chooser(); // => "Gah"
chooser(); // => "Foo" -- only repeats once all items are exhausted.
添加回答
举报
0/150
提交
取消