37 lines
548 B
Go
37 lines
548 B
Go
package testutil
|
|
|
|
import (
|
|
"math/rand"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
var SeededRand *rand.Rand
|
|
|
|
func init() {
|
|
SeededRand = NewSeededRand(time.Now().UTC().UnixNano())
|
|
}
|
|
|
|
func NewSeededRand(seed int64) *rand.Rand {
|
|
src := rand.NewSource(seed)
|
|
return rand.New(&LockedRandSource{src: src})
|
|
}
|
|
|
|
type LockedRandSource struct {
|
|
lk sync.Mutex
|
|
src rand.Source
|
|
}
|
|
|
|
func (r *LockedRandSource) Int63() (n int64) {
|
|
r.lk.Lock()
|
|
n = r.src.Int63()
|
|
r.lk.Unlock()
|
|
return
|
|
}
|
|
|
|
func (r *LockedRandSource) Seed(seed int64) {
|
|
r.lk.Lock()
|
|
r.src.Seed(seed)
|
|
r.lk.Unlock()
|
|
}
|