mirror of
https://github.com/golang/go
synced 2024-11-21 22:34:48 -07:00
Make the operations on the global rng thread safe.
R=r, rsc CC=golang-dev https://golang.org/cl/168041
This commit is contained in:
parent
3ca1b1d27f
commit
916533119e
@ -5,6 +5,8 @@
|
||||
// Package rand implements pseudo-random number generators.
|
||||
package rand
|
||||
|
||||
import "sync"
|
||||
|
||||
// A Source represents a source of uniformly-distributed
|
||||
// pseudo-random int64 values in the range [0, 1<<63).
|
||||
type Source interface {
|
||||
@ -91,7 +93,7 @@ func (r *Rand) Perm(n int) []int {
|
||||
* Top-level convenience functions
|
||||
*/
|
||||
|
||||
var globalRand = New(NewSource(1))
|
||||
var globalRand = New(&lockedSource{src: NewSource(1)})
|
||||
|
||||
// Seed uses the provided seed value to initialize the generator to a deterministic state.
|
||||
func Seed(seed int64) { globalRand.Seed(seed) }
|
||||
@ -148,3 +150,21 @@ func NormFloat64() float64 { return globalRand.NormFloat64() }
|
||||
// sample = ExpFloat64() / desiredRateParameter
|
||||
//
|
||||
func ExpFloat64() float64 { return globalRand.ExpFloat64() }
|
||||
|
||||
type lockedSource struct {
|
||||
lk sync.Mutex;
|
||||
src Source;
|
||||
}
|
||||
|
||||
func (r *lockedSource) Int63() (n int64) {
|
||||
r.lk.Lock();
|
||||
n = r.src.Int63();
|
||||
r.lk.Unlock();
|
||||
return;
|
||||
}
|
||||
|
||||
func (r *lockedSource) Seed(seed int64) {
|
||||
r.lk.Lock();
|
||||
r.src.Seed(seed);
|
||||
r.lk.Unlock();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user