package utils import ( "crypto/rand" "encoding/binary" "fmt" ) // 使用真随机数 实现摇摇乐 // 对数组随机生成 指定次数:10万次 (不得低于10万次) func TrueRandomForLotteryDraw(int64Slice []int64, times int) (map[int64]int, int64, int, error) { if times < 100000 { times = 100000 } var randInt64List []int64 countMap := make(map[int64]int) for i := 0; i < times; i++ { randInt64, err := TrueRandomInt64Slice(int64Slice) if err != nil { return countMap, 0, 0, err } randInt64List = append(randInt64List, randInt64) } var maxTimes int = 0 var maxId int64 = 0 for _, num := range randInt64List { countMap[num]++ if countMap[num] > maxTimes { maxTimes = countMap[num] maxId = num } } return countMap, maxId, maxTimes, nil } // 随机int64 切片 func TrueRandomInt64Slice(ids []int64) (int64, error) { if len(ids) == 0 { return 0, fmt.Errorf("len ids is zero") } if len(ids) == 1 { return ids[0], nil } randInt, err := TrueRandomInt(0, len(ids)-1) return ids[randInt], err } // 生成指定范围内的真随机数 func TrueRandomInt(min, max int) (int, error) { if min > max { return 0, fmt.Errorf("min cannot be greater than max") } // 生成随机字节 var n uint32 err := binary.Read(rand.Reader, binary.BigEndian, &n) if err != nil { return 0, err } // 映射到指定范围 rangeSize := uint32(max - min + 1) result := min + int(n%rangeSize) return result, nil }