这使得数组的值不会重复 n 次随机播放的任何先前位置(我使用数组大小的一半作为 n,之后我重新启动禁止索引)。最后修改了这个版本,使其不重复当前位置。
为此,您必须保存原始数组的每个值所在的所有索引的历史记录。为此,我为您的数字增加了一点复杂性
var numberArray = [{value:1, unavailable_indexes:[0]},
{value:2, unavailable_indexes:[1]},
{value:3, unavailable_indexes:[2]},
{value:4, unavailable_indexes:[3]},
{value:5, unavailable_indexes:[4]},
{value:6, unavailable_indexes:[5]},
{value:7, unavailable_indexes:[6]},
{value:8, unavailable_indexes:[7]},
{value:9, unavailable_indexes:[8]}
];
这样你就有了值中的数字和它所在的所有位置的数组。接下来我们需要运行所有数组并切换数字。
var arrayLen = numberArray.length-1;
$.each(numberArray, function(index, value){
var newIndex;
//restart the array when half of the index have been covered or it will take awhile to get a random index that wasn't used
if(value.unavailable_indexes.length >= numberArray.length/2)
value.unavailable_indexes = [index];//restart the unavailable indexes with the current index as unavailable
do{
newIndex = Math.floor(Math.random()*arrayLen);
//verify if you can swap the 2 values, if any of them have been on the destination index get another random index
}while($.inArray(value.unavailable_indexes, newIndex) || $.inArray(numberArray[newIndex].unavailable_indexes, index));
numberArray[index] = numberArray[newIndex];
numberArray[newIndex] = value;
})
在所有阵列移动后,您需要保存它们降落的位置
$.each(numberArray, function(index, value){
value.unavailable_indexes.push(index);
}
编辑:如果你只是想防止它只是重复以前的位置然后unavailable_indexes
保持它的最后一个位置并替换为do{...}while()
:
do{
newIndex = Math.floor(Math.random()*arrayLen);
}while(newIndex != value.unavailable_indexes)
最后一种方法看起来像:
$.each(numberArray, function(index, value){
value.unavailable_indexes = index;
}