bitbucket.org/ai69/amoy@v0.2.3/random.go (about) 1 package amoy 2 3 import ( 4 "errors" 5 "time" 6 7 "github.com/1set/gut/yrand" 8 ) 9 10 // FeelLucky returns the random decision as per a given successful rate. 11 func FeelLucky(rate float64) bool { 12 r, _ := yrand.Float64() 13 return r < rate 14 } 15 16 // ChooseWeightStrMap selects a random string key according to weights in value, or panics for invalid weights or internal errors. 17 func ChooseWeightStrMap(weightMap map[string]float64) string { 18 var ( 19 keys []string 20 weights []float64 21 ) 22 for n, w := range weightMap { 23 keys = append(keys, n) 24 weights = append(weights, w) 25 } 26 pos, err := yrand.WeightedChoice(weights) 27 if err != nil { 28 panic(err) 29 } 30 return keys[pos] 31 } 32 33 var ( 34 errMinMaxRange = errors.New("min should be less than max") 35 ) 36 37 // RandomInt returns a random int number in [min, max). 38 func RandomInt(min, max int) int { 39 if min >= max { 40 panic(errMinMaxRange) 41 } 42 n, _ := yrand.IntRange(min, max) 43 return n 44 } 45 46 // RandomFloat returns a random float64 number in [min, max). 47 func RandomFloat(min, max float64) float64 { 48 if min >= max { 49 panic(errMinMaxRange) 50 } 51 f, _ := yrand.Float64() 52 return (max-min)*f + min 53 } 54 55 // RandomString returns a random string with given length, length should be greater than 0. 56 func RandomString(length int) string { 57 s, err := yrand.StringBase62(length) 58 if err != nil { 59 panic(err) 60 } 61 return s 62 } 63 64 // RandomTime returns a random time between [start, start+d) or [start+d, start) if d < 0. 65 func RandomTime(start time.Time, d time.Duration) time.Time { 66 var delta int64 67 if d > 0 { 68 delta, _ = yrand.Int64Range(0, d.Nanoseconds()) 69 } else if d < 0 { 70 delta, _ = yrand.Int64Range(d.Nanoseconds(), 0) 71 } else { 72 return start 73 } 74 return start.Add(time.Duration(delta) * time.Nanosecond) 75 } 76 77 // RandomTimeBetween returns a random time between [start, end). 78 func RandomTimeBetween(start, end time.Time) time.Time { 79 delta := end.Sub(start) 80 if delta <= 0 { 81 return start 82 } 83 return RandomTime(start, delta) 84 } 85 86 // RandomDuration returns a random duration between [min, max). 87 func RandomDuration(min, max time.Duration) time.Duration { 88 if max <= min { 89 return max 90 } 91 delta, _ := yrand.Int64Range(min.Nanoseconds(), max.Nanoseconds()) 92 return time.Duration(delta) * time.Nanosecond 93 }