您设计了一个从数组中随机选择项目的函数,确保最近的选择不会重复。虽然当前的解决方案有效,但您担心其效率以及是否会导致过度循环。让我们探索一种更有效的方法。
1.递归注意事项
是的,您的 ChooseName() 函数可以被视为递归函数,因为它会调用自身,直到找到唯一的名称。递归对于某些问题可能很有用,但重要的是要注意堆栈的使用和深度过大的可能性。
2.高效的解决方案
为了解决效率问题,我们可以采取不同的策略。我们可以创建原始数组的副本并从副本中随机选择项目,直到选择所有项目,而不是依赖递归和循环直到找到唯一的名称。一旦所有项目都用完,我们将副本重置为其原始状态。
这是此方法的 JavaScript 实现:
<code class="javascript">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']); console.log(chooser()); // => "Bar" console.log(chooser()); // => "Foo" console.log(chooser()); // => "Gah" console.log(chooser()); // => "Foo" -- only repeats once all items are exhausted.</code>
此方法利用 JavaScript 的数组 slice() 方法创建原始数组的浅表副本。然后,它重复地从副本中选择随机项目并将其从副本中删除,从而有效地模仿随机选择,而不重复,直到所有项目都用完为止。一旦选择了所有项目,副本就会重置,从而可以重新开始随机选择。
以上是如何高效、不重复地随机选择数组项?的详细内容。更多信息请关注PHP中文网其他相关文章!