为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

FFIVE 2019-10-21 12:48:09
我知道这个问题有很多种,但是我还没有找到与我的效率问题相关的答案。我有下面的代码可以正常工作。我有一个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.


查看完整回答
反对 回复 2019-10-21
  • 3 回答
  • 0 关注
  • 318 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信