diff --git a/g/util/grand/grand.go b/g/util/grand/grand.go index ff1c66972..1c94f8e48 100644 --- a/g/util/grand/grand.go +++ b/g/util/grand/grand.go @@ -12,15 +12,27 @@ var ( digits = []rune("0123456789") ) +// 随机计算是否满足给定的概率(分子/分母) +func Meet(num, total int) bool { + return Rand(0, total) <= num +} + +// 随机计算是否满足给定的概率(float64) +func MeetProb(prob float64) bool { + return Rand(0, 1e17) <= int(prob*1e17) +} + +// Rand 别名 +func N (min, max int) int { + return Rand(min, max) +} + // 获得一个 min, max 之间的随机数(min <= x <= max) func Rand (min, max int) int { if min >= max { return min } - if min == 0 { - return intn(max + 1) - } - if min > 0 { + if min >= 0 { // 数值往左平移,再使用底层随机方法获得随机数,随后将结果数值往右平移 return intn(max - (min - 0) + 1) + (min - 0) } @@ -31,6 +43,11 @@ func Rand (min, max int) int { return 0 } +// RandStr 别名 +func Str(n int) string { + return RandStr(n) +} + // 获得指定长度的随机字符串(可能包含数字和字母) func RandStr(n int) string { b := make([]rune, n) @@ -44,6 +61,11 @@ func RandStr(n int) string { return string(b) } +// RandDigits 别名 +func Digits(n int) string { + return RandDigits(n) +} + // 获得指定长度的随机数字字符串 func RandDigits(n int) string { b := make([]rune, n) @@ -53,6 +75,11 @@ func RandDigits(n int) string { return string(b) } +// RandLetters 别名 +func Letters(n int) string { + return RandLetters(n) +} + // 获得指定长度的随机字母字符串 func RandLetters(n int) string { b := make([]rune, n) diff --git a/geg/other/test2.go b/geg/other/test2.go index 8c4f76ecb..51cba4c94 100644 --- a/geg/other/test2.go +++ b/geg/other/test2.go @@ -2,31 +2,11 @@ package main import ( "fmt" - "gitee.com/johng/gf/g" - "gitee.com/johng/gf/g/util/gconv" + "gitee.com/johng/gf/g/util/grand" ) func main() { - type Score struct { - Name string - Result int - } - type User struct { - Scores []*Score - } - - user := new(User) - scores := map[string]interface{}{ - "Scores" : map[string]interface{}{ - "Name" : "john", - "Result" : 100, - }, - } - - // 嵌套struct转换,属性为slice类型,数值为map类型 - if err := gconv.Struct(scores, user); err != nil { - fmt.Println(err) - } else { - g.Dump(user) - } + fmt.Println(float64(10)/3) + fmt.Println(grand.Meet(1, 1)) + fmt.Println(grand.MeetProb(float64(1)/2)) } \ No newline at end of file