javascript - Shuffle Array 函数产生相同的结果

标签 javascript arrays shuffle

这是一个低级且肮脏的普通 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 

  }

问题是,所有这三个变量都产生相同的结果。数组被打乱一次,然后就不再打乱。我似乎无法确定这是什么。我猜这是某种范围/提升问题,但我真的无法弄清楚。感谢您的帮助!

最佳答案

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

array = array.slice();

完成此更改后,shuffle1shuffle2shuffle3 将成为三个不同的数组。并且,原数组不会被修改;这可能是好事也可能是坏事,具体取决于您的设计。

或者,您可以保留 shuffle 函数并克隆每个返回值:

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

关于javascript - Shuffle Array 函数产生相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36050553/

相关文章:

javascript - 如何使用具有透明背景的 Canvas 获取 CSS 样式元素的 png 图像?

javascript - 重新格式化数组以实现 jquery 自动完成

python - 迭代多个 numpy 数组并处理当前和先前元素的有效方法?

javascript - JavaScript 中一组数字的随机排列

Javascript 数组洗牌不应输出两个相邻的数组

javascript - 无法使用对齐参数将表格放置在中心

javascript - 将颜色填充到 d3 世界地图(等值线图)

javascript - 如何根据内部数组属性的过滤来过滤数组?

arrays - 查找对象数组的索引

java - stdrandom shuffle 方法的工作原理