initial import
This commit is contained in:
41
core/mathx/unstable.go
Normal file
41
core/mathx/unstable.go
Normal file
@@ -0,0 +1,41 @@
|
||||
package mathx
|
||||
|
||||
import (
|
||||
"math/rand"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Unstable struct {
|
||||
deviation float64
|
||||
r *rand.Rand
|
||||
lock *sync.Mutex
|
||||
}
|
||||
|
||||
func NewUnstable(deviation float64) Unstable {
|
||||
if deviation < 0 {
|
||||
deviation = 0
|
||||
}
|
||||
if deviation > 1 {
|
||||
deviation = 1
|
||||
}
|
||||
return Unstable{
|
||||
deviation: deviation,
|
||||
r: rand.New(rand.NewSource(time.Now().UnixNano())),
|
||||
lock: new(sync.Mutex),
|
||||
}
|
||||
}
|
||||
|
||||
func (u Unstable) AroundDuration(base time.Duration) time.Duration {
|
||||
u.lock.Lock()
|
||||
val := time.Duration((1 + u.deviation - 2*u.deviation*u.r.Float64()) * float64(base))
|
||||
u.lock.Unlock()
|
||||
return val
|
||||
}
|
||||
|
||||
func (u Unstable) AroundInt(base int64) int64 {
|
||||
u.lock.Lock()
|
||||
val := int64((1 + u.deviation - 2*u.deviation*u.r.Float64()) * float64(base))
|
||||
u.lock.Unlock()
|
||||
return val
|
||||
}
|
||||
Reference in New Issue
Block a user