You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
785 B
40 lines
785 B
1 year ago
|
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
|
||
|
}
|