52 lines
787 B
Go
52 lines
787 B
Go
package GoUtil
|
|
|
|
import (
|
|
"math/rand"
|
|
"time"
|
|
)
|
|
|
|
func RandMap(d map[int]int) int {
|
|
total := 0
|
|
for _, v := range d {
|
|
total += v
|
|
}
|
|
|
|
// 生成一个 [0, total) 范围内的随机数
|
|
r := rand.Intn(total)
|
|
|
|
// 根据随机数选择一个键
|
|
for k, v := range d {
|
|
if r < v {
|
|
return k
|
|
}
|
|
r -= v
|
|
}
|
|
|
|
// 如果没有找到,返回一个默认值
|
|
return -1
|
|
}
|
|
|
|
// 从d中随机选取n个元素 不放回
|
|
func RandMapNum(d map[int]int, n int) []int {
|
|
if n <= 0 || n > len(d) {
|
|
return nil
|
|
}
|
|
if n == len(d) {
|
|
for k := range d {
|
|
return []int{k}
|
|
}
|
|
}
|
|
r := make([]int, 0, n)
|
|
for i := 0; i < n; i++ {
|
|
k := RandMap(d)
|
|
r = append(r, k)
|
|
delete(d, k)
|
|
}
|
|
return r
|
|
}
|
|
|
|
func GetRand() *rand.Rand {
|
|
randS := rand.NewSource(time.Now().UnixNano())
|
|
return rand.New(randS)
|
|
}
|