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  }