github.com/letsencrypt/boulder@v0.20251208.0/grpc/internal/grpcrand/grpcrand.go (about) 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/v2" 25 "sync" 26 ) 27 28 var ( 29 r = rand.New(rand.NewPCG(rand.Uint64(), rand.Uint64())) 30 mu sync.Mutex 31 ) 32 33 // Int implements rand.Int on the grpcrand global source. 34 func Int() int { 35 mu.Lock() 36 defer mu.Unlock() 37 return r.Int() 38 } 39 40 // Int63n implements rand.Int63n on the grpcrand global source. 41 func Int63n(n int64) int64 { 42 mu.Lock() 43 defer mu.Unlock() 44 return r.Int64N(n) 45 } 46 47 // Intn implements rand.Intn on the grpcrand global source. 48 func Intn(n int) int { 49 mu.Lock() 50 defer mu.Unlock() 51 return r.IntN(n) 52 } 53 54 // Float64 implements rand.Float64 on the grpcrand global source. 55 func Float64() float64 { 56 mu.Lock() 57 defer mu.Unlock() 58 return r.Float64() 59 } 60 61 // Uint64 implements rand.Uint64 on the grpcrand global source. 62 func Uint64() uint64 { 63 mu.Lock() 64 defer mu.Unlock() 65 return r.Uint64() 66 }