package GoUtil

import (
	"math/rand"
	"time"
)

func RandMap(d map[int]int) int {
	if len(d) == 0 {
		return 0
	}
	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 0
}

func RandStringMap(d map[string]int) string {
	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 ""
}

// 从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)
}
