* Update to avoid pseudo-random number This PR update the usage of rand so that non-global seed is used. Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Add concurrency-safe random source See https://stackoverflow.com/questions/48958886/how-to-create-a-thread-safe-rand-source Signed-off-by: Yong Tang <yong.tang.github@outlook.com>
36 lines
741 B
Go
36 lines
741 B
Go
// Package rand is used for concurrency safe random number generator.
|
|
package rand
|
|
|
|
import (
|
|
"math/rand"
|
|
"sync"
|
|
)
|
|
|
|
// Rand is used for concurrency safe random number generator.
|
|
type Rand struct {
|
|
m sync.Mutex
|
|
r *rand.Rand
|
|
}
|
|
|
|
// New returns a new Rand from seed.
|
|
func New(seed int64) *Rand {
|
|
return &Rand{r: rand.New(rand.NewSource(seed))}
|
|
}
|
|
|
|
// Int returns a non-negative pseudo-random int from the Source in Rand.r.
|
|
func (r *Rand) Int() int {
|
|
r.m.Lock()
|
|
v := r.r.Int()
|
|
r.m.Unlock()
|
|
return v
|
|
}
|
|
|
|
// Perm returns, as a slice of n ints, a pseudo-random permutation of the
|
|
// integers in the half-open interval [0,n) from the Source in Rand.r.
|
|
func (r *Rand) Perm(n int) []int {
|
|
r.m.Lock()
|
|
v := r.r.Perm(n)
|
|
r.m.Unlock()
|
|
return v
|
|
|
|
}
|