Shuffle Array 函数产生相同的结果

Shuffle Array function yields same result

这是一个肮脏的普通问题 javascript。我正在使用经典的数组随机播放功能:

  function shuffle(array) {
    var currentIndex = array.length, temporaryValue, randomIndex;

    while (0 !== currentIndex) {

      randomIndex = Math.floor(Math.random() * currentIndex);
      currentIndex -= 1;

      temporaryValue = array[currentIndex];
      array[currentIndex] = array[randomIndex];
      array[randomIndex] = temporaryValue;
    }

    return array;
  }

然后在另一个函数中重复调用:

  function generateQuartile (array) {

    var shuffle1 = shuffle(array);

    var shuffle2 = shuffle(array);

    var shuffle3 = shuffle(array);

    //all three shuffles are the same 

  }

问题是,所有这三个变量都产生相同的结果。数组被洗牌一次,然后不再洗牌。我似乎无法确定这是什么。我猜这是某种 scoping/hoisting 问题,但我真的想不通。感谢您的帮助!

洗牌工作正常。问题是您每次都 return 使用同一个数组。在每次调用时,您需要使用随机元素创建一个新数组。最简单的方法是在函数的开头克隆数组:

array = array.slice();

随着这一变化,shuffle1shuffle2shuffle3 将成为三个不同的数组。另外,原数组不会被修改;这可能是好事也可能是坏事,具体取决于您的设计。

或者,您可以单独保留 shuffle 函数并克隆每个 return 值:

var shuffle1 = shuffle(array).slice();
// etc.