1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- package model
- import (
- "errors"
- "go-common/library/log"
- )
- //Stra 实验策略
- type Stra struct {
- //精度
- Precision int `json:"precision"`
- //依次比例
- Ratio []int `json:"ratio"`
- }
- func (s *Stra) check() (isValid bool) {
- sum := 0
- for _, r := range s.Ratio {
- sum += r
- }
- isValid = (sum == s.Precision)
- return
- }
- //Check ensure stra valid
- func (s *Stra) Check() (isValid bool) {
- return s.check()
- }
- //Version calculate version by score
- func (s *Stra) Version(score int) (version int, err error) {
- if !s.check() {
- err = errors.New("the sum of ratio is not equal to precision")
- log.Error("[model.stra|Version] s.check failed")
- return
- }
- if score >= s.Precision || score < 0 {
- err = errors.New("score should between 0 and s.Precision")
- return
- }
- for i, r := range s.Ratio {
- if score >= r {
- score -= r
- } else {
- version = i
- break
- }
- }
- return
- }
|