我正在对一个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