Instantly share code, notes, and snippets.

Embed
What would you like to do?
go runtime中的洗牌算法测试
package main
import (
"math/rand"
"time"
"fmt"
)
var report map[int][]int
func shuffle(r *rand.Rand) {
var data [10]int
for i := 0; i < 10; i++ {
data[i] = i
}
for i := 0; i < 10; i++ {
o := data[i]
j := r.Int() % (i + 1)
data[i] = data[j]
data[j] = o
}
for i := 0; i < 10; i++ {
pos_list := report[data[i]]
pos_list[i]++
}
}
func main() {
// init
report = make(map[int][]int, 10)
for i := 0; i < 10; i++ {
report[i] = make([]int, 10)
}
// shuffling
src := rand.NewSource(time.Now().UnixNano())
r := rand.New(src)
for n := 0; n < 10000; n++ {
shuffle(r)
}
// report result
for k, v := range report {
fmt.Printf("%d -> ", k)
for _, p := range v {
fmt.Printf("%5d ", p)
}
fmt.Printf("\n")
}
}
@skoo87

This comment has been minimized.

Owner

skoo87 commented Sep 27, 2013

测试结果,每个数字出现在数组各个位置的次数

2 -> 969 1004 999 998 916 1058 983 1028 1042 1003
1 -> 1007 989 1006 991 972 1022 996 1013 995 1009
7 -> 1022 1024 992 1022 1058 956 1028 978 959 961
3 -> 1018 1014 1009 999 1013 945 989 982 1025 1006
4 -> 990 995 1007 1027 981 963 974 993 1003 1067
8 -> 1008 989 1029 963 1037 1036 1036 974 941 987
9 -> 993 1000 979 1018 1040 1021 1020 917 1003 1009
0 -> 1016 993 940 1009 1020 1032 1006 996 988 1000
5 -> 1003 976 1020 977 972 1001 947 1062 1054 988
6 -> 974 1016 1019 996 991 966 1021 1057 990 970

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment