当前位置: 首页 > 面试题库 >

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

厍华清
2023-03-14
问题内容

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

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

我有一个10个项目的数组,可以从中随机选择一个项目(按Enter键)。该代码保留了不能随机选择的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);

问题答案:

每当选择一项时,将其移至阵列的背面,然后从原始阵列的一部分中随机选择array.slice(0, -5)

var a = ["Roger", "Russell", "Clyde", "Egbert", "Clare", "Bobbie", "Simon", "Elizabeth", "Ted", "Caroline"];

var chooseName = function () {
    var unique = true;
    num = Math.floor(Math.random() * a.length - 5);
    name = a.splice(num,1);
    a.push(name);
}


window.addEventListener("keypress", function (e) {
    var keycode = e.keyCode;
    if (keycode == 13) {
        chooseName();
    }
}, false);

编辑:这也有一个副作用,即不给任何出现在列表尾部的变量一个不公平的缺点,即在前N个调用中不会考虑它们。如果这对您来说是个问题,请尝试在某个位置保留一个静态变量,以跟踪要使用的切片的大小,并将其最大化为B(在这种情况下为5)。例如

var a = ["Roger", "Russell", "Clyde", "Egbert", "Clare", "Bobbie", "Simon", "Elizabeth", "Ted", "Caroline"];
B = 5; //max size of 'cache'
N = 0;

var chooseName = function () {
    var unique = true;
    num = Math.floor(Math.random() * a.length - N);
    N = Math.min(N + 1, B);
    name = a.splice(num,1);
    a.push(name);
}


 类似资料:
  • 问题内容: 我有一种方法,它使用随机样本来近似计算。这种方法被称为数百万次,因此非常重要的是选择随机数的过程必须高效。 我不确定java到底有多快,但是我的程序似乎并没有像我期望的那样受益。 选择随机数时,我将执行以下操作(半伪代码): 现在,这显然具有最坏的最坏情况下的运行时间,因为理论上随机函数可以为永恒添加重复的数字,从而永远停留在while循环中。但是,数字是从{0..45}中选择的,因此

  • 问题内容: 我有以下代码从PHP 数组中选取元素: 给定一个大数组,但只有几个元素(例如out ),这相对较慢,因此我想对其进行优化,以使并非所有元素都必须改组。这些值必须是唯一的。 我正在寻找性能最好的替代产品。我们可以假设它没有重复项并且被索引了。 问题答案: 这将提供5个元素,而且没有重复项,而且很快。密钥将被保留。 注意:您必须确保$ array包含5个或更多的元素,或者添加某种检查以防止

  • 问题内容: 该代码从一组预设颜色中选择一种随机颜色。如何使同一颜色不会被多次拾取? 问题答案: 创建一个索引数组。从数组中删除索引之一,然后使用它来获取颜色。 像这样: 上面的代码创建一个数组。该函数看是否为空。如果是,则使用0到的索引值填充它。 然后,它在数组中选择一个随机索引,从数组中的该索引处删除值,然后使用它从中获取并返回一个对象。(它不会从中删除对象。它使用间接操作,并从indexsAr

  • 我正在编写一个二十一点游戏。我有一个所有可用牌类型的枚举。交易时,我想使用Random从枚举中随机选择一张牌给玩家。如何使用整数值对应枚举值?或者,我如何为该枚举的变量随机选择枚举值? 纸牌Enun:

  • 问题内容: 我有两个相关的numpy数组和。我需要从中选择随机行,并将其存储在数组中,并将其对应的值附加到随机选择的点的索引上。 我有另一个数组,它存储我不想采样的索引列表。 我怎样才能做到这一点? 样本数据: 如果这些是随机选择的(其中): 所需的输出将是: 我怎样才能做到这一点? 问题答案: 您可以使用以下方法创建随机索引: 然后,您只需要使用结果索引数组:

  • 问题内容: 假设我有一个看起来像这样的数据框: 如何才能为每一行随机选择一个(或多个)行?假设我希望每人随机抽取一次,我将得到: 问题答案: