Javascript随机化数组而不使元素处于起始位置
我有一个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与
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;
};