我正在对一个3整型的数组进行600万次洗牌.我在映射中对数组的每个排列进行计数.下面是使用Go的代码.

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func randRange(min, max int) int {
    return rand.Intn(max-min+1) + min
}

func NaiveShuffle(arr *[3]int) {
    for i := 0; i < 3; i++ {
        e := randRange(0, 2)
        arr[e], arr[i] = arr[i], arr[e]
    }
}

func main() {
    rand.Seed(time.Now().UnixNano())
    m := make(map[[3]int]int, 6)
    arr := [3]int{-6,10,184}

    for i := 1; i <= 6000000; i++ {
        a := arr
        NaiveShuffle(&arr)
        m[a]++
    }

    for k, v := range m {
        fmt.Println(k, ":", v)
    }

}

因为我做的是天真的洗牌,我的理解是它应该not产生均匀分布的排列.但我得到的是:

[184 -6 10] : 1000074
[184 10 -6] : 1000764
[-6 10 184] : 1000766
[10 184 -6] : 998090
[-6 184 10] : 1000479
[10 -6 184] : 999827

这表明这6种可能的排列中的每一种都出现了大约1M次.为什么我得到的似乎是均匀分布?

编辑:将代码更改为仅设定一次种子.我现在明白了:

[-6 184 10] : 999507
[184 -6 10] : 1000401
[10 -6 184] : 1002163
[10 184 -6] : 999236
[-6 10 184] : 999016
[184 10 -6] : 999677

EDIT2:多亏了霍布斯,我意识到我犯了一个愚蠢的错误.我应该洗a次,而不是arr次.我现在明白了:

[10 -6 184] : 1111056
[-6 10 184] : 888442
[184 -6 10] : 888576
[10 184 -6] : 1109896
[-6 184 10] : 1113148
[184 10 -6] : 888882

推荐答案

你一遍又一遍地洗arr次,在洗牌之间没有把它恢复到原来的状态--换句话说,你的600万次试验不是independent次.尽管每一次洗牌都有不均匀的排列分布,但将这些排列叠加600万次会产生非常接近均匀的分布.

Go相关问答推荐

Golang regexpp:获取带有右括号的单词

GO:如何指定类型约束,使S方法的参数类型与接收方的参数类型相同

正确使用pgtype的方法

无法获取RPC描述符

这是go语言gin提供的关于TypeEngine和RouterGroup的问题

生成一个 CSV/Excel,在 Golang 中该列的下拉选项中指定值

从 ApiGateway 中的 lambda Go 返回 Json

如何使用gosdk在Dynamodb中进行UpdateItem时,将ValueBuilder对象声明为StringSet类型?

错误!在为 age-viewer-go 运行 wails dev 或 wails build 命令时

我无法使用反向代理更改主机标头

在本地 go 应用程序上获取秘密的正确策略

如何使用 GolangCI 删除未使用的导入

如何使用带有方法的字符串枚举作为通用参数?

处理程序后访问 HTTP 请求上下文

为什么时间很短.睡眠时间比基准测试中要求的(约 300 ns)长?

Ginkgo/Gomega panic 测试失败

Golang 有类似 C++ 的 decltype 的东西吗?

如何在 Gorm 中获得特定日期的最大值?

在 go (1.18) 的泛型上实现多态的最佳方法是什么?

我应该明确地创建一个与Belongs To或Has Many对称的关系吗?