Shuffle Array函数产生相同的结果

时间:2016-03-17 02:22:31

标签: javascript arrays shuffle

这是一个肮脏的香草javascript问题。我使用经典的数组shuffle函数:

  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 

  }

问题是,这三个变量都产生了相同的结果。数组被洗牌一次,然后不再洗牌。我似乎无法确定这是什么。我猜它是某种范围/提升问题,但我真的无法弄明白。谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

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

array = array.slice();

通过此更改,shuffle1shuffle2shuffle3将是三个不同的数组。此外,原始数组不会被修改;根据您的设计,这可能是好事也可能是坏事。

或者,您可以单独保留shuffle功能并克隆每个返回值:

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