package random import ( "math/rand" "strings" "sync" "time" ) var r *rand.Rand var mu sync.Mutex func init() { r = rand.New(rand.NewSource(time.Now().UnixNano())) } // String returns a random string, 20 characters long. func String() string { mu.Lock() defer mu.Unlock() var output strings.Builder chars := "abcdedfghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" for i := 0; i < 20; i++ { random := r.Intn(len(chars)) output.WriteString(string(chars[random])) } return output.String() } // Float64 returns a random float64 between 0 and 1. func Float64() float64 { mu.Lock() defer mu.Unlock() return r.Float64() } // Intn returns a random int >=0 and < n. func Intn(n int) int { mu.Lock() defer mu.Unlock() return r.Intn(n) } // Jitter returns a randomly-chosen duration between d and 2d. func Jitter(d time.Duration) time.Duration { mu.Lock() defer mu.Unlock() return d + time.Duration(r.Float64()*float64(d)) }