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.
39 lines
785 B
39 lines
785 B
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 |
|
}
|
|
|