算法

参见 抢红包算法

代码

注意

  • 我这里用了k8s的rand.IntnRange,也可以用内置的math/rand,把我代码里的相关注释取消就可以了
  • 我这里金额采用的是整数,是以分为单位的
package main

import (
	"fmt"
	"k8s.io/apimachinery/pkg/util/rand"
	//"math/rand"
	"sort"
)

func main() {
	fmt.Println(hongbao(9, 6))
}

func hongbao(money, count int) []int {
	if count <= 0 || money < count {
		panic("错误的参数")
	}
	if count == 1 {
		return []int{money}
	}
	result := make([]int, count)
	if count == money { // 这种情况冲突特别多,10块钱发给10个人的时候,耗时特别长
		for i := 0; i < len(result); i++ {
			result[i] = 1
		}
		return result
	}
	set := make(map[int]struct{})
	setKey := make([]int, 0)
	//rand.Seed(time.Now().UnixNano()) 
	for len(set) < count-1 { // 分割线段,只需要count-1
		randNum := rand.IntnRange(1,money-1)
		//randNum := rand.Intn(money-2) + 1 
		if _, ok := set[randNum]; ok {
			continue
		}
		set[randNum] = struct{}{}
		setKey = append(setKey, randNum)
	}
	sort.Slice(setKey, func(i, j int) bool {
		return setKey[i] < setKey[j]
	})
	setKey = append(setKey, money)

	result[0] = setKey[0]
	for i := 1; i < len(setKey); i++ {
		result[i] = setKey[i] - setKey[i-1]
	}
	return result
}

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐