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

我知道这个问题有很多种,但是我还没有找到与我的效率问题相关的答案。


我有下面的代码可以正常工作。


我有一个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);


FFIVE
浏览 319回答 3
3回答

ABOUTYOU

我喜欢评论者@YuriyGalanter的想法,即随机选择所有项目,直到所有项目都被提取,然后再重复,所以这里是一个实现:function randomNoRepeats(array) {&nbsp; var copy = array.slice(0);&nbsp; return function() {&nbsp; &nbsp; if (copy.length < 1) { copy = array.slice(0); }&nbsp; &nbsp; var index = Math.floor(Math.random() * copy.length);&nbsp; &nbsp; var item = copy[index];&nbsp; &nbsp; copy.splice(index, 1);&nbsp; &nbsp; return item;&nbsp; };}var chooser = randomNoRepeats(['Foo', 'Bar', 'Gah']);chooser(); // => "Bar"chooser(); // => "Foo"chooser(); // => "Gah"chooser(); // => "Foo" -- only repeats once all items are exhausted.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript