我知道这个问题有很多形式,但我一直无法找到与我的具体效率问题相关的答案。
我有下面的代码,效果很好。
我有一个包含 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);
我喜欢评论者 @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.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)