gitee.com/zhongguo168a/gocodes@v0.0.0-20230609140523-e1828349603f/myx/randutil/rand-util.go (about)

     1  package randutil
     2  
     3  import "math/rand"
     4  
     5  // 如果max小于min,返回min
     6  // 如果min等于0,返回0
     7  func Range(min int, max int) int {
     8  	if max < min {
     9  		return min
    10  	}
    11  	if min == 0 {
    12  		return min
    13  	}
    14  	return min + rand.Intn(max-min)
    15  }
    16  
    17  // key = 键, val=权重
    18  func Weight(source map[int]int) int {
    19  
    20  	var (
    21  		prev int
    22  		list []int
    23  		m    = map[int]int{}
    24  		max  int
    25  	)
    26  
    27  	count := 0
    28  	for key, val := range source {
    29  		cur := prev + val
    30  		list = append(list, cur)
    31  		m[count] = key
    32  		count++
    33  
    34  		prev = cur
    35  		max = cur
    36  	}
    37  
    38  	if max == 0 {
    39  		return 0
    40  	}
    41  	n := rand.Intn(max)
    42  	idx := 0
    43  	for i, val := range list {
    44  		if n <= val {
    45  			idx = i
    46  			break
    47  		}
    48  	}
    49  
    50  	return m[idx]
    51  }
    52  
    53  // key = 键, val=权重
    54  func WeightString(source map[string]int) string {
    55  
    56  	var (
    57  		prev int
    58  		list []int
    59  		m    = map[int]string{}
    60  		max  int
    61  	)
    62  
    63  	count := 0
    64  	for key, val := range source {
    65  		cur := prev + val
    66  		list = append(list, cur)
    67  		m[count] = key
    68  		count++
    69  
    70  		prev = cur
    71  		max = cur
    72  	}
    73  
    74  	if max == 0 {
    75  		return ""
    76  	}
    77  	n := rand.Intn(max)
    78  	idx := 0
    79  	for i, val := range list {
    80  		if n <= val {
    81  			idx = i
    82  			break
    83  		}
    84  	}
    85  
    86  	return m[idx]
    87  }