以固定位置洗牌数组作为例外

Shuffle Array with a fixed position as exception

本文关键字:数组 定位 位置      更新时间:2023-09-26

我有一个输出多个id的数组。订单应该被洗牌,但第一个ID应该留在这个位置。我看过Fisher-Yates(又名Knuth) Shuffle,但我不确定如何为我的情况编辑它。

一种方法是将其拆分为两个数组。一个只有一个对象。然后用另一根柱子洗牌。洗牌之后,我将两个数组组合在一起,就像我在这个小提琴中所做的那样: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;

但是我想知道是否有更好/更漂亮的方法来做到这一点?

应该像shuffle(arr, start, length)那样调用shuffle函数,这样代码就变得简单了。

<>之前函数shuffle(array, start, length) {var currentIndex, i, tmp, randomIndex;For (i = length;I> 1;我(){//选择一个剩余的元素…randomIndex = start + Math.floor(Math.random() * i);currentIndex = start + i - 1;//与当前元素交换。tmp = array[currentIndex];array[currentIndex] = array[randomIndex];array[randomIndex] = tmp;}}//数组列表post idVar arr = [2,11,37,42,88,234,23,71,172,82];随机(arr, 1, arr)长度- 1);document.body。innerHTML = arr;之前

请注意,我删除了return arr,因为它是混乱的,当一个函数修改数组在地方返回它。

我猜你可能会这样做

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

,

与其随机选择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;
}