Javascript随机化数组而不使元素处于起始位置

Javascript随机化数组而不使元素处于起始位置,javascript,arrays,function,random,shuffle,Javascript,Arrays,Function,Random,Shuffle,我有一个javascript问题。我让用户输入一个名称列表,然后将其放入数组中。长话短说,我正在为人们设计一种随机的方式,以确定他们将为谁购买圣诞礼物。例如,原始数组由以下名称组成: Alex Joel Lindsay Cori 然后,我想将这些名称随机排列,以便得到一个随机列表,如下所示: Lindsay Cori Joel Alex 然后,我将显示第一个数组中的名称,并将它们与相同位置中的随机名称对齐。例如,在本例中,Alex与Lindsay关联,Joel与Cori关联,Lindsay与

我有一个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
这意味着亚历克斯和科里有联系,乔尔和亚历克斯有联系,林赛和林赛有联系,科里和乔尔有联系。这就是问题所在。如果这是一个看谁给谁买圣诞礼物的程序,林赛就不能给林赛买礼物

解决此问题的合适数组随机化函数是什么


谢谢你的帮助

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

我想这就是你想要的:(我在末尾加了一张支票,记得把它去掉)


var start=['Alex'、'Joel'、'Lindsay'、'Cori']
函数洗牌(数组){
//支持
var支持=[];
对于(var i=0;i
尝试
--m
,而不是
m--


因为如果您使用
m--
您可能会得到
i==m
并与其本身交换数组元素。

为什么不添加检查以确保相同的名称不匹配?这不再是随机的,但看起来像是你在寻找的,我该怎么做呢?我在for循环中有一个if函数,表示如果名称相等,那么我将再次调用该函数。然而,这并没有包括所有的名字,而且这似乎不是最好的解决方案。你可以为每个名字找到随机的名字,而不是乱洗。每次从可搜索数组中删除查找到的名称和当前名称时,我都没有意识到这是一个如此简单的修复。非常感谢。我刚刚意识到你是对的\o/。对不起。@Pedro没关系,我已经准备好讨论了:)
<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>
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;
};