You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gostring/random.string.go

77 lines
1.7 KiB

5 months ago
package gostring
import (
2 months ago
"math/rand/v2"
5 months ago
"time"
)
// GenerateRandomString 生成count个长度length不重复的随机数
func GenerateRandomString(length, count int) []string {
return GenerateRandomStringFunc(length, count, func(num string) bool {
return false
})
}
// GenerateRandomStringFunc 生成count个长度length不重复的随机数支持外部查询
func GenerateRandomStringFunc(length, count int, dFun func(num string) bool) []string {
var fI int = 0
startStr := "1"
endStr := "9"
alphabet := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
2 months ago
seed := time.Now().UnixNano() // rand内部运算的随机数
rand.New(rand.NewPCG(uint64(seed), uint64(seed))) // rand计算得到的随机数
5 months ago
for {
if fI+2 > length {
break
}
startStr += "0"
endStr += "9"
fI = fI + 1
}
return GenerateRandomStringNumber(ToInt(startStr), ToInt(endStr), count, alphabet, length, dFun)
}
// GenerateRandomStringNumber 生成count个[start,end)结束的不重复的随机数
func GenerateRandomStringNumber(start, end, count int, alphabet string, length int, dFun func(num string) bool) []string {
// 范围检查
if end < start || len(alphabet) == 0 || (end-start) < count {
return nil
}
// 存放结果的slice
results := make([]string, 0)
for len(results) < count {
// 生成随机字符串
str := make([]byte, length)
for i := range str {
2 months ago
str[i] = alphabet[rand.IntN(len(alphabet))]
5 months ago
}
// 查重
exist := false
for _, v := range results {
if v == string(str) {
exist = true
break
}
}
if !exist {
isExist := dFun(string(str))
if !isExist {
results = append(results, string(str))
}
}
}
return results
}