具有固定位置的洗牌数组作为例外

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);

;