Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript js中的洗牌数组_Javascript_Arrays_Shuffle - Fatal编程技术网

Javascript js中的洗牌数组

Javascript js中的洗牌数组,javascript,arrays,shuffle,Javascript,Arrays,Shuffle,我想用javascript洗牌一个数组 我首先编写了这个函数: 函数洗牌(arr){ 对于(i=0;i

我想用javascript洗牌一个数组

我首先编写了这个函数:

函数洗牌(arr){
对于(i=0;i
我的算法如下:

  • 随机选择一个项目
  • 随机选择另一项
  • 将这两个项目切换到一起
但我最终得到了temp0,temp1和temp2都相等的结果

然后我把我的代码改成这个,它工作得很好

函数shuffle1(arr){
对于(i=0;i
唯一发生的变化是:为索引随机创建的数字被分配给一个变量,然后该变量用于选择数组中的项

有人能帮我理解为什么第一个例子不能像第二个例子中预期的那样工作吗


提前感谢

使用Fisher方法应能更有效地工作:

/**
 * Shuffles array in place.
 * @param {Array} a items An array containing the items.
 */
function shuffle (arr) {
    var j, x, index;
    for (index = arr.length - 1; index > 0; index--) {
        j = Math.floor(Math.random() * (index + 1));
        x = arr[index];
        arr[index] = arr[j];
        arr[j] = x;
    }
    return arr;
}

原始答案:

使用Fisher方法应该更有效:

/**
 * Shuffles array in place.
 * @param {Array} a items An array containing the items.
 */
function shuffle (arr) {
    var j, x, index;
    for (index = arr.length - 1; index > 0; index--) {
        j = Math.floor(Math.random() * (index + 1));
        x = arr[index];
        arr[index] = arr[j];
        arr[j] = x;
    }
    return arr;
}

原始答案:

它不更新的原因是您正在更新的数字没有引用回数组中的元素。让我们看看节点REPL

我们将创建一个数组,并尝试以两种方式更新它,然后查看是否在数组中看到了更新

> let a = [1,2,3]
undefined
> let f = a[0]  // grab reference to 1st element
undefined
> f
1
> f = 2         // 1. try to update via our variable
2
> a[0]          
1               // update has NOT worked
> a[0] = 2      // 2. try to update by array index
2
> a[0]          
2               // update has worked
一旦我们将第一个函数更改为通过数组索引更新,两个函数都是相同的

当我更新
f
时,我会给它分配一个新的数字对象,并断开与
a[0]
的链接,该链接仍然指向旧的数字。在js中,数字是不可变的,所以即使我们想更新,也无法更新它们

相关的:

它不更新的原因是,您正在更新的数字没有返回到数组中的元素。让我们看看节点REPL

我们将创建一个数组,并尝试以两种方式更新它,然后查看是否在数组中看到了更新

> let a = [1,2,3]
undefined
> let f = a[0]  // grab reference to 1st element
undefined
> f
1
> f = 2         // 1. try to update via our variable
2
> a[0]          
1               // update has NOT worked
> a[0] = 2      // 2. try to update by array index
2
> a[0]          
2               // update has worked
一旦我们将第一个函数更改为通过数组索引更新,两个函数都是相同的

当我更新
f
时,我会给它分配一个新的数字对象,并断开与
a[0]
的链接,该链接仍然指向旧的数字。在js中,数字是不可变的,所以即使我们想更新,也无法更新它们

相关的:

这是否回答了您的问题?您在
tmep0=temp1的
shuffle()
中有一个输入错误和javascript引用外部(全局)范围的变量checkout这是否回答了您的问题?您在
tmep0=temp1的
shuffle()
中有一个输入错误和javascript引用外部(全局)范围签出的变量