grpcrand.go (1723B)
1 /* 2 * 3 * Copyright 2018 gRPC authors. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 */ 18 19 // Package grpcrand implements math/rand functions in a concurrent-safe way 20 // with a global random source, independent of math/rand's global source. 21 package grpcrand 22 23 import ( 24 "math/rand" 25 "sync" 26 "time" 27 ) 28 29 var ( 30 r = rand.New(rand.NewSource(time.Now().UnixNano())) 31 mu sync.Mutex 32 ) 33 34 // Int implements rand.Int on the grpcrand global source. 35 func Int() int { 36 mu.Lock() 37 defer mu.Unlock() 38 return r.Int() 39 } 40 41 // Int63n implements rand.Int63n on the grpcrand global source. 42 func Int63n(n int64) int64 { 43 mu.Lock() 44 defer mu.Unlock() 45 return r.Int63n(n) 46 } 47 48 // Intn implements rand.Intn on the grpcrand global source. 49 func Intn(n int) int { 50 mu.Lock() 51 defer mu.Unlock() 52 return r.Intn(n) 53 } 54 55 // Int31n implements rand.Int31n on the grpcrand global source. 56 func Int31n(n int32) int32 { 57 mu.Lock() 58 defer mu.Unlock() 59 return r.Int31n(n) 60 } 61 62 // Float64 implements rand.Float64 on the grpcrand global source. 63 func Float64() float64 { 64 mu.Lock() 65 defer mu.Unlock() 66 return r.Float64() 67 } 68 69 // Uint64 implements rand.Uint64 on the grpcrand global source. 70 func Uint64() uint64 { 71 mu.Lock() 72 defer mu.Unlock() 73 return r.Uint64() 74 }