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. 21package grpcrand 22 23import ( 24 "math/rand" 25 "sync" 26 "time" 27) 28 29var ( 30 r = rand.New(rand.NewSource(time.Now().UnixNano())) 31 mu sync.Mutex 32) 33 34// Int63n implements rand.Int63n on the grpcrand global source. 35func Int63n(n int64) int64 { 36 mu.Lock() 37 res := r.Int63n(n) 38 mu.Unlock() 39 return res 40} 41 42// Intn implements rand.Intn on the grpcrand global source. 43func Intn(n int) int { 44 mu.Lock() 45 res := r.Intn(n) 46 mu.Unlock() 47 return res 48} 49 50// Float64 implements rand.Float64 on the grpcrand global source. 51func Float64() float64 { 52 mu.Lock() 53 res := r.Float64() 54 mu.Unlock() 55 return res 56} 57