关于shuffle函数的问题

时间:2014-04-21 05:42:06

标签: javascript

我知道肯定有更好的方法来改变,更糟糕的是洗牌的方法,但我试图弄清楚这个功能是如何运作的。如此陈词滥调,如果你不能解释为三岁,你就不会理解它"。这个功能对我来说很难向三岁的孩子解释。我写了一些关于我认为函数的作用的评论,但是有人可以详细描述这个函数的每个步骤在arr [i]的值设置为temp之后最重要的。

var shuffle = function(array) {
    //creates a copy of the array
    array = array.slice()
    //iterates through the array
    for (var i = 0; i < array.length; i++){
      //generates a random index no longer than the length of the array
      var j = Math.floor(Math.random() * array.length);
      //stores the iterated values of array[i]
      var temp = array[i];
      //confusing part!
      array[i] = array[j];
      //confusing part!
      array[j] = temp;
    }
    //returns the newly modified copy of the original array
    return array;
  };

2 个答案:

答案 0 :(得分:0)

这三行可用于交换array[i]array[j]之间的值。

  1. array[i]的商店值temp

  2. array[j]的商店值array[i]。现在,array[i]的值为array[j]

  3. 将值从temp恢复为array[j]。现在,array[j]的实际值为array[i]

  4. 完成此步骤后,array[i]的值将位于array[j]array[j]的值将位于array[i]

    您实施的算法与Fisher-Yates shuffle的版本略有不同。

    基本上,在每次迭代时,都会选择一个随机数(严格小于数组大小的长度)。然后,将交换当前索引(array[i])处的元素和与随机选择的索引(array[j])对应的元素。

答案 1 :(得分:0)

标记为“令人困惑”的部分只是用随机选择的元素交换当前数组元素的值。它将当前值放在临时变量中,用random元素替换当前元素,然后用随机元素替换随机元素。