| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- 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
- }
|