Files
Go-http_framework/util/splitNumToN/SplitNumToN.go
T

73 lines
1.8 KiB
Go

/*
* @Author : huangZJ
* @Time : 2021/6/15 11:20
* @Description:将一个数拆分成其他N个数,这N个数相加的结果等于这个数
*/
package splitNumToN
import "Go-Tool/util/rand"
type Splitter struct {
NumCount int //拆分成随机数的数量
Num int //被拆分的总数
MinValue int //被拆分的最小值
MaxValue int //被拆分的最大值
SplitNumList []int //存放拆解之后的结果
}
func NewSplitter(numCount, num int) *Splitter {
//给定默认的限制的最大最小值
splitter := &Splitter{
NumCount: numCount,
Num: num,
MinValue: 1,
MaxValue: 6,
SplitNumList: make([]int, 0),
}
//校验数值是否满足
splitter.checkValue()
return splitter
}
func (splitter *Splitter) checkValue() {
if splitter.MinValue*splitter.NumCount > splitter.Num {
panic("被拆分的数值过小")
}
if splitter.MaxValue*splitter.NumCount < splitter.Num {
panic("被拆分的数值过大")
}
}
//将一个数拆成N个,并且保证N个数相加值等于被拆分的这个数
func (splitter *Splitter) SplitNumToN() {
var count int
for i := 0; i < splitter.NumCount-1; i++ {
randNum := splitter.getRandValue(splitter.Num-count, splitter.NumCount-1-i)
splitter.SplitNumList = append(splitter.SplitNumList, randNum)
count = count + randNum
}
splitter.SplitNumList = append(splitter.SplitNumList, splitter.Num-count)
}
func (splitter *Splitter) GetRandNumList() []int {
return splitter.SplitNumList
}
//num 被随机的数
//count count + 1 = 总随机数数量
func (splitter *Splitter) getRandValue(num int, count int) int {
minValue := num - splitter.MaxValue*count
if minValue <= 0 {
minValue = splitter.MinValue
}
maxValue := num - count*1
if maxValue > splitter.MaxValue {
maxValue = splitter.MaxValue
}
return rand.GetRandInt(minValue, maxValue)
}