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  }