首页 >web前端 >js教程 >如何高效、不重复地随机选择数组项?

如何高效、不重复地随机选择数组项?

Susan Sarandon
Susan Sarandon原创
2024-10-31 03:54:01783浏览

How to Efficiently Select Array Items Randomly Without Repetition?

高效地随机选择数组项目而不重复

您设计了一个从数组中随机选择项目的函数,确保最近的选择不会重复。虽然当前的解决方案有效,但您担心其效率以及是否会导致过度循环。让我们探索一种更有效的方法。

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn