【问题标题】:Javascript randomize array without having element in starting position [duplicate]Javascript随机化数组,起始位置没有元素[重复]
【发布时间】:2013-12-16 02:40:38
【问题描述】:

我有一个 JavaScript 问题。我让一个用户输入一个名称列表,然后我将其放入一个数组中。长话短说,我正在编程一种随机方式,让人们知道他们会为谁买圣诞礼物。例如,原始数组由以下名称组成:

Alex
Joel
Lindsay
Cori

然后我想将名称随机化,以便得到一个随机列表,类似于以下内容:

Lindsay
Cori
Joel
Alex

然后,我将显示第一个数组中的名称,并将它们与同一位置的随机名称对齐。例如,在此示例中,Alex 与 Lindsay 相关联,Joel 与 Cori 相关联,Lindsay 与 Joel 相关联,Cori 与 Alex 相关联。我目前正在使用以下随机化方法:

function shuffle(array){
    var m = array.length, t, i;
    while(m){
        i = Math.floor(Math.random() * m--);
        t = array[m];
        array[m] = array[i];
        array[i] = t;
    }
    return array;
};

这个函数的问题是数组没有随机化到一个新的位置。例如,使用这种方法,我可以有以下初始数组:

Alex
Joel
Lindsay
Cori

而我的数组,用上面的函数来随机化它,会产生这样的结果:

Cori
Alex
Lindsay
Joel

这意味着 Alex 与 Cori 相关联,Joel 与 Alex 相关联,Lindsay 与 Lindsay 相关联,Cori 与 Joel 相关联。这就是问题所在。如果这是一个查看谁为谁购买圣诞礼物的程序,Lindsay 不能为 Lindsay 购买礼物。

什么是合适的数组随机函数来解决这个问题?

感谢您的帮助!!

【问题讨论】:

  • 为什么不添加检查以确保相同的名称不匹配?这不再是随机的,但它似乎是您正在寻找的东西
  • 我该如何做呢?我在 for 循环中有一个 if 函数,说明如果名称相等,那么我将再次调用该函数。然而,这并没有包括所有的名字,而且它似乎不是最好的解决方案。
  • 您可以找到每个名称的随机名称,而不是洗牌。并每次从可搜索数组中删除找到的名称和当前名称

标签: javascript arrays function random shuffle


【解决方案1】:

试试--m,而不是m--

function shuffle(array){
    var m = array.length, t, i;
    while(m){
        i = Math.floor(Math.random() * --m);
        t = array[m];
        array[m] = array[i];
        array[i] = t;
    }
    return array;
};

因为如果你使用m--,你可能会得到i == m并与它自己交换数组元素。

【讨论】:

  • 我没有意识到这是一个如此简单的修复。谢谢!
  • 我刚刚意识到你是对的... \o/。对不起。
  • @Pedro 没关系,我已经准备好讨论了 :)
【解决方案2】:

首先我建立了一个索引数组,然后将其洗牌并检查最后的卡住。

我想这就是你想要的:(我在最后添加了一个检查,记得删除它)

<script>
    var start = [ 'Alex', 'Joel', 'Lindsay', 'Cori' ]

    function shuffle(array) {
        // Support
        var support = [];
        for(var i = 0; i < array.length; i++) {
            support[i] = i;
        }

        // Support Build
        for(var i = 0; i < support.length; i++) {
            var random = Math.floor(Math.random() * (support.length - i)) + i;

            if(i == (support.length - 2) && support[i + 1] == (i + 1)) {
                var ex = support[i];
                support[i] = support[i + 1];
                support[i + 1] = ex;
                break;
            }

            if(random == support[i]) {
                i--;
                continue;
            }

            var ex = support[i];
            support[i] = support[random];
            support[random] = ex;
        }

        // Result
        var result = [];
        for(var i = 0; i < support.length; i++) {
            result[i] = array[support[i]];
        }

        return result;
    };

    for(var i = 0; i < 1000; i++) {
        if(start == shuffle(start))
            alert('fail.');
    }
</script>

【讨论】:

    猜你喜欢
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2013-11-24
    • 2016-05-15
    • 1970-01-01
    相关资源
    最近更新 更多