github.com/lingyao2333/mo-zero@v1.4.1/core/mathx/unstable.go (about) 1 package mathx 2 3 import ( 4 "math/rand" 5 "sync" 6 "time" 7 ) 8 9 // An Unstable is used to generate random value around the mean value base on given deviation. 10 type Unstable struct { 11 deviation float64 12 r *rand.Rand 13 lock *sync.Mutex 14 } 15 16 // NewUnstable returns an Unstable. 17 func NewUnstable(deviation float64) Unstable { 18 if deviation < 0 { 19 deviation = 0 20 } 21 if deviation > 1 { 22 deviation = 1 23 } 24 return Unstable{ 25 deviation: deviation, 26 r: rand.New(rand.NewSource(time.Now().UnixNano())), 27 lock: new(sync.Mutex), 28 } 29 } 30 31 // AroundDuration returns a random duration with given base and deviation. 32 func (u Unstable) AroundDuration(base time.Duration) time.Duration { 33 u.lock.Lock() 34 val := time.Duration((1 + u.deviation - 2*u.deviation*u.r.Float64()) * float64(base)) 35 u.lock.Unlock() 36 return val 37 } 38 39 // AroundInt returns a random int64 with given base and deviation. 40 func (u Unstable) AroundInt(base int64) int64 { 41 u.lock.Lock() 42 val := int64((1 + u.deviation - 2*u.deviation*u.r.Float64()) * float64(base)) 43 u.lock.Unlock() 44 return val 45 }