思路:

    1. 假设原始数组P长度为54,数组中每个元素对应着一张牌,每次洗牌的工程相当于对数组中的元素随机重新排列,随机重排过后,第一个元素开始,一次发牌给玩家,就能保证玩家的牌是随机的了。
    2. 而随机的过程则是通过不断的循环,随机函数,直到将原数组所有元素全部放到新的数组为止。
    3. 每次产生的随机数,都与最后一个值进行交换,这样做的好处是,不再需要辅助数组Q,等循环结束时,数组P本身就是对原来数组随机重排的结果,可以省去O(n)的空间复杂度。

    写法:
    js
    const data = ["方块A", "梅花A", ..."大王"];
    function init() {
    const newData = [];

    for (let i = 0; i < data.length; i++) {
    const activeIndex = Math.floor(Math.random() * (54 - i));

    newData.push(data[activeIndex]);

    const temp = data[activeIndex];

    data[activeIndex] = data[54 - i - 1];
    data[54 - i - 1] = temp;
    }
    }

    结果:
    image.png

    Go
    package main

    import (
    “fmt”
    “math/rand”
    )

    func main() {
    var arr [54]string

    arr[0] = “方块A”
    arr[1] = “梅花A”
    arr[2] = “红心A”
    arr[3] = “黑桃A”

    arr[4] = “方块2”
    arr[5] = “梅花2”
    arr[6] = “红心2”
    arr[7] = “黑桃2”

    arr[8] = “方块3”
    arr[9] = “梅花3”
    arr[10] = “红心3”
    arr[11] = “黑桃3”

    arr[12] = “方块4”
    arr[13] = “梅花4”
    arr[14] = “红心4”
    arr[15] = “黑桃4”

    arr[16] = “方块5”
    arr[17] = “梅花5”
    arr[18] = “红心5”
    arr[19] = “黑桃5”

    arr[20] = “方块6”
    arr[21] = “梅花6”
    arr[22] = “红心6”
    arr[23] = “黑桃6”

    arr[24] = “方块7”
    arr[25] = “梅花7”
    arr[26] = “红心7”
    arr[27] = “黑桃7”

    arr[28] = “方块8”
    arr[29] = “梅花8”
    arr[30] = “红心8”
    arr[31] = “黑桃8”

    arr[32] = “方块9”
    arr[33] = “梅花9”
    arr[34] = “红心9”
    arr[35] = “黑桃9”

    arr[36] = “方块10”
    arr[37] = “梅花10”
    arr[38] = “红心10”
    arr[39] = “黑桃10”

    arr[40] = “方块J”
    arr[41] = “梅花J”
    arr[42] = “红心J”
    arr[43] = “黑桃J”

    arr[44] = “方块Q”
    arr[45] = “梅花Q”
    arr[46] = “红心Q”
    arr[47] = “黑桃Q”

    arr[48] = “方块K”
    arr[49] = “梅花K”
    arr[50] = “红心K”
    arr[51] = “黑桃K”

    arr[52] = “小王”
    arr[53] = “大王”

    var newData [54]string

    for i := 0; i < 54; i++ {
    activeIndex := rand.Intn(54 - i)

    1. temp := arr[activeIndex]
    2. newData[i] = temp<br /> arr[activeIndex] = arr[54 - i - 1]<br /> arr[54 - i -1] = temp<br /> }

    fmt.Println(newData)
    }

    结果:
    image.png