如何在JS中专门改组数组?

时间:2017-06-18 18:49:42

标签: javascript arrays

var testArray = [0, 1, 2, 3, 4, 5, 6]

如果我有这个阵列并希望将其改组,我知道要使用Fisher-Yates Shuffle,但我怎么能以更有条理的方式将其洗牌?

比如,我将如何改变它,但也保证0在洗牌之后永远不会出现在数组的第一个位置,1永远不会出现在数组的第二个位置2 {1}}永远不会出现在第三位,等等。

3 个答案:

答案 0 :(得分:0)

考虑使用Sattolo的算法,描述为here

它与Fisher-Yates基本相同,但只有一个小的变化导致阵列的元素无法保持在自己的位置,这似乎就是你所描述的。

答案 1 :(得分:0)

var finalArray = [];

function getUniqueNumber() {
    var uniqueNumber = Math.floor(Math.random() * 6) + 0;
    var doesExist = finalArray.indexOf(uniqueNumber) === -1;

    if (!doesExist) {
        return getUniqueNumber();
    } else {
        return uniqueNumber;
    }
}

function generateTestArray() {
    for (var i = 0; i < 6; i++) {
        finalArray.push(getUniqueNumber());
    }
    console.log(finalArray);
}

这将始终生成一个唯一混乱索引的测试数组。

答案 2 :(得分:0)

/** fisher yates as seen on wikipedia
 * for i from n−1 downto 1 do
 *   j ← random integer such that 0 ≤ j ≤ i
 *   exchange a[j] and a[i] 
 */

/** modified fisher yates as described
 * for i from n−1 downto 1 do
 *   j ← random integer such that 0 ≤ j ≤ i, j != i, a[j] != i, a[i] != j
 *   exchange a[j] and a[i] (where a[j] != i)
 */

let modifiedFYShuffle = (array) => {
  let swap = (i, j) => {
    let tmp = array[i];
    array[i] = array[j];
    array[j] = tmp;
  }
  for (let i = array.length - 1; i >= 0; --i) {
    let j = i;
    while (j === i || array[j] === i || array[i] === j) {
      j = Math.floor(Math.random() * array.length);
    }
    swap(i, j)
  }
}

let makeArray = () => {
  let array = [];
  for (let i = 0; i < 10; ++i) {
    array[i] = i;
  }
  return array;
}

for (let i = 0; i < 10; ++i) {
  let array = makeArray();
  modifiedFYShuffle(array);
  console.log(array)
}