73 lines
1.8 KiB
Go
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)
|
||
|
|
}
|