Javascript随机化数组,而没有元素在起始位置

Ale*_*ses 2 javascript arrays random shuffle function

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

Alex
Joel
Lindsay
Cori
Run Code Online (Sandbox Code Playgroud)

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

Lindsay
Cori
Joel
Alex
Run Code Online (Sandbox Code Playgroud)

然后,我将显示第一个数组中的名称,并将它们与同一位置中的随机名称对齐.例如,在此示例中,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;
};
Run Code Online (Sandbox Code Playgroud)

此函数的问题是数组不会随机化到新位置.例如,使用此方法,我可以拥有以下初始数组:

Alex
Joel
Lindsay
Cori
Run Code Online (Sandbox Code Playgroud)

而我的数组,使用上面的函数随机化它,将导致如下所示:

Cori
Alex
Lindsay
Joel
Run Code Online (Sandbox Code Playgroud)

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

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

感谢您的帮助!!

Ton*_*ony 5

尝试--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;
};
Run Code Online (Sandbox Code Playgroud)

因为如果你使用,m--你可以自己获取i == m和交换数组元素.