具有固定位置的洗牌数组作为例外
Shuffle Array with a fixed position as exception
我有一个输出多个 ID 的数组。顺序应该打乱,但第一个ID应该留在这个位置。
我看过 Fisher-Yates(又名 Knuth)Shuffle,但我不确定如何根据我的情况对其进行编辑。
一种方法是将它分成两个数组。一个与单个对象。然后将数组与另一个 post 打乱。洗牌后,我像在 fiddle 中所做的那样合并两个数组:https://jsfiddle.net/464fmfty/2/
// array listing post ids
var arr = [2, 11, 37, 42, 88, 234, 23, 71, 172, 82];
var arrNew = [];
arrNew.push(arr.shift());
arr = shuffle(arr);
arrNew.push(arr);
document.body.innerHTML= arrNew;
但我想知道是否有更好/更漂亮的方法来做到这一点?
好吧,与其选择 2 个随机位置来洗牌,不如选择 2 个大于 0 的位置。
var arr = [2, 11, 37, 42, 88, 234, 23, 71, 172, 82]
for (var i = 0; i < 50; i++) {
var from = Math.floor(Math.random() * (arr.length - 1)) + 1;
var to = Math.floor(Math.random() * (arr.length - 1)) + 1;
var temp = arr[from];
arr[from] = arr[to];
arr[to] = temp;
}
shuffle
函数应该像shuffle(arr, start, length)
那样调用,这样代码就变得简单了。
function shuffle(array, start, length) {
var currentIndex, i, tmp, randomIndex;
for (i = length; i > 1; i--) {
// Pick a remaining element...
randomIndex = start + Math.floor(Math.random() * i);
currentIndex = start + i - 1;
// And swap it with the current element.
tmp = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = tmp;
}
}
// array listing post ids
var arr = [2, 11, 37, 42, 88, 234, 23, 71, 172, 82];
shuffle(arr, 1, arr.length - 1);
document.body.innerHTML= arr;
请注意,我删除了 return arr
,因为当函数就地修改数组 和 returns 时会造成混淆。
我猜你可能会这样做
function shuffleFromOne(arr){
var i = arr.length,
j,
tmp;
while (i > 1) {
j = Math.floor(Math.random()*--i)+1;
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
return arr;
}
var arr = [1,2,3,4,5,6,7,8,9],
brr = shuffleFromOne(arr);
console.log(brr);
;
我有一个输出多个 ID 的数组。顺序应该打乱,但第一个ID应该留在这个位置。 我看过 Fisher-Yates(又名 Knuth)Shuffle,但我不确定如何根据我的情况对其进行编辑。
一种方法是将它分成两个数组。一个与单个对象。然后将数组与另一个 post 打乱。洗牌后,我像在 fiddle 中所做的那样合并两个数组:https://jsfiddle.net/464fmfty/2/
// array listing post ids
var arr = [2, 11, 37, 42, 88, 234, 23, 71, 172, 82];
var arrNew = [];
arrNew.push(arr.shift());
arr = shuffle(arr);
arrNew.push(arr);
document.body.innerHTML= arrNew;
但我想知道是否有更好/更漂亮的方法来做到这一点?
好吧,与其选择 2 个随机位置来洗牌,不如选择 2 个大于 0 的位置。
var arr = [2, 11, 37, 42, 88, 234, 23, 71, 172, 82]
for (var i = 0; i < 50; i++) {
var from = Math.floor(Math.random() * (arr.length - 1)) + 1;
var to = Math.floor(Math.random() * (arr.length - 1)) + 1;
var temp = arr[from];
arr[from] = arr[to];
arr[to] = temp;
}
shuffle
函数应该像shuffle(arr, start, length)
那样调用,这样代码就变得简单了。
function shuffle(array, start, length) { var currentIndex, i, tmp, randomIndex; for (i = length; i > 1; i--) { // Pick a remaining element... randomIndex = start + Math.floor(Math.random() * i); currentIndex = start + i - 1; // And swap it with the current element. tmp = array[currentIndex]; array[currentIndex] = array[randomIndex]; array[randomIndex] = tmp; } } // array listing post ids var arr = [2, 11, 37, 42, 88, 234, 23, 71, 172, 82]; shuffle(arr, 1, arr.length - 1); document.body.innerHTML= arr;
请注意,我删除了 return arr
,因为当函数就地修改数组 和 returns 时会造成混淆。
我猜你可能会这样做
function shuffleFromOne(arr){
var i = arr.length,
j,
tmp;
while (i > 1) {
j = Math.floor(Math.random()*--i)+1;
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
return arr;
}
var arr = [1,2,3,4,5,6,7,8,9],
brr = shuffleFromOne(arr);
console.log(brr);
;