【问题标题】:Having trouble understanding part of my code, The Fisher–Yates shuffle无法理解我的部分代码,The Fisher-Yates shuffle
【发布时间】:2021-07-10 16:42:36
【问题描述】:

我正在了解“The Fisher Yates shuffle”并遇到了一个问题。我突出显示并评论“This Work”、“This doesn't Work”的代码部分是对数组进行洗牌。根据我对 Javascript 的理解,不起作用的部分应该起作用。你能解释一下为什么它不起作用吗?

const array = [..."12345678"]

let arrayShuffle = function(arr){


    for(let i = array.length - 1; i > 0; i--){
        let randomNum = Math.floor(Math.random() * (i + 1))
        let temp;

        let currentPos = arr[i] 
        let randomPos = arr[randomNum]

        /* This Work(it shuffled) \/ */
        temp = arr[i]
        arr[i] = arr[randomNum]
        arr[randomNum] = temp



        /* This Doesnt Work(Doesn't shuffle) \/ */
        // temp = currentPos
        // currentPos = randomPos
        // randomPos = temp
    }

    return arr
}

let res = arrayShuffle(array)
console.log(res)

【问题讨论】:

  • 赋值给变量和赋值给数组元素是不同的。
  • @AmitVerma 嗨,很抱歉打扰您,我刚刚开始学习 javascript,我不明白您分配给变量和分配给数组元素的意思是不同的。如果可以的话,能不能详细一点?

标签: javascript


【解决方案1】:

这不起作用,因为currentPos = arr[i]randomPos = arr[randomNum]。这两个都是复制 arr 中的值,而不是实际指针。因此,当您更改 currentPosrandomPos 时,您只是更改了数组中实际内容的副本。

举个例子,

let x == 5
let y == x
y = y+1
console.log(x)
console.log(y) 

x = 5
y = 6

这里也发生了同样的事情。当我们让 y = x 时,它只是复制 x 中的值,而不是对 x 的实际引用。因此,当我们更改 y 时,我们更改 y,而 x 不受影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    相关资源
    最近更新 更多