javascript - 如何有效地随机选择数组项而不重复?

标签 javascript

我知道这个问题有很多种形式,但我无法找到与我的具体效率问题相关的答案。

我有下面的代码,效果很好。

我有一个 10 项数组,我从中随机选择一个项(按回车键)。该代码保留了 5 个不能随机选择的最近选择的数组(以避免随时间重复太多)。

如果 chooseName() 函数最初选择了一个在最近 5 次中使用过的名称,它会简单地中断并再次调用自身,重复直到找到一个“唯一”的名称。

我有两个问题:

  1. 说这是一个“递归函数”对吗?

  2. 我担心从理论上讲,这可能会在找到唯一名称之前循环很长时间 - 是否有更有效的方法来做到这一点?

感谢您的帮助。

    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.

关于javascript - 如何有效地随机选择数组项而不重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17891173/

相关文章:

javascript - Prop (对象列表)更新后 react 不渲染

javascript - jQuery 的 AJAX 请求不起作用

javascript - 代理设置一个值

javascript - Hammer js - off() 方法不起作用

javascript - D3.js 还是 Sigmajs 更适合网络可视化?

javascript - 纯 HTML5 音频播放器 : duration and start

Javascript:如何获取放置事件的文本值?

javascript - 如何从中心开始设置 div 的动画

javascript - 在 React Native 移动应用程序中检测相机的高度和宽度

来自 Underscore 文档的 JavaScript 相等性