In Golang How to generate a random string of random length within range without integers

huangapple go评论107阅读模式
英文:

In Golang How to generate a random string of random length within range without integers

问题

我尝试使用正则表达式从生成的字符串中删除整数,但这样做不能给我所需范围内的长度(很多长度会小于最小值)。

  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "math/rand"
  6. "regexp"
  7. "time"
  8. )
  9. func randomString(length int) string {
  10. rand.Seed(time.Now().UnixNano())
  11. b := make([]byte, length)
  12. rand.Read(b)
  13. return fmt.Sprintf("%x", b)[:length]
  14. }
  15. func randomLength(minL, maxL int) int {
  16. rand.Seed(time.Now().UnixNano())
  17. return rand.Intn(maxL-minL) + minL
  18. }
  19. func main() {
  20. reg, err := regexp.Compile("[^a-zA-Z]+")
  21. if err != nil {
  22. log.Fatal(err)
  23. }
  24. for i := 0; i < 10; i++ {
  25. processedString := reg.ReplaceAllString(randomString(randomLength(8, 16)), "")
  26. println(processedString)
  27. }
  28. }

编辑:
当我搜索问题时,我错过了详细的@icza在那个问题中的回答。这里是他的回答。

英文:

I tried to remove the integer from the generated string with regex but this will not give me the length within the range required( many will be less than the minimum )

  1. package main
  2. import (
  3. &quot;fmt&quot;
  4. &quot;log&quot;
  5. &quot;math/rand&quot;
  6. &quot;regexp&quot;
  7. &quot;time&quot;
  8. )
  9. func randomString(length int) string {
  10. rand.Seed(time.Now().UnixNano())
  11. b := make([]byte, length)
  12. rand.Read(b)
  13. return fmt.Sprintf(&quot;%x&quot;, b)[:length]
  14. }
  15. func randomLength(minL, maxL int) int {
  16. rand.Seed(time.Now().UnixNano())
  17. return rand.Intn(maxL-minL) + minL
  18. }
  19. func main() {
  20. reg, err := regexp.Compile(&quot;[^a-zA-Z]+&quot;)
  21. if err != nil {
  22. log.Fatal(err)
  23. }
  24. for i := 0; i &lt; 10; i++ {
  25. processedString := reg.ReplaceAllString(randomString(randomLength(8, 16)), &quot;&quot;)
  26. println(processedString)
  27. }
  28. }

Edit:
when I searched for the question I missed detailed @icza answer in that question.

答案1

得分: 3

  1. var seededRand = rand.New(rand.NewSource(time.Now().UnixNano()))
  2. func StringWithCharset(length int, charset string) string {
  3. b := make([]byte, length)
  4. for i := range b {
  5. b[i] = charset[seededRand.Intn(len(charset)-1)]
  6. }
  7. return string(b)
  8. }
  9. func main() {
  10. rangeStart := 0
  11. rangeEnd := 10
  12. offset := rangeEnd - rangeStart
  13. randLength := seededRand.Intn(offset) + rangeStart
  14. charSet := "aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ"
  15. randString := StringWithCharset(randLength, charSet)
  16. }
  1. var seededRand = rand.New(rand.NewSource(time.Now().UnixNano()))
  2. func StringWithCharset(length int, charset string) string {
  3. b := make([]byte, length)
  4. for i := range b {
  5. b[i] = charset[seededRand.Intn(len(charset)-1)]
  6. }
  7. return string(b)
  8. }
  9. func main() {
  10. rangeStart := 0
  11. rangeEnd := 10
  12. offset := rangeEnd - rangeStart
  13. randLength := seededRand.Intn(offset) + rangeStart
  14. charSet := "aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ"
  15. randString := StringWithCharset(randLength, charSet)
  16. }
英文:
  1. var seededRand = rand.New(rand.NewSource(time.Now().UnixNano()))
  2. func StringWithCharset(length int, charset string) string {
  3. b := make([]byte, length)
  4. for i := range b {
  5. b[i] = charset[seededRand.Intn(len(charset)-1)]
  6. }
  7. return string(b)
  8. }
  9. func main() {
  10. rangeStart := 0
  11. rangeEnd := 10
  12. offset := rangeEnd - rangeStart
  13. randLength := seededRand.Intn(offset) + rangeStart
  14. charSet := &quot;aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ&quot;
  15. randString := StringWithCharset(randLength, charSet)
  16. }

答案2

得分: 1

你只需要定义你正在使用的字母表。类似以下的方式(你可以在Go Playground中进行调试)。

  1. package main
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "strings"
  6. "time"
  7. )
  8. func main() {
  9. rand.Seed(time.Now().UnixNano())
  10. var alphabet []rune = []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
  11. rs := randomString(20, alphabet)
  12. fmt.Printf("这是相当随机的字符串:%s\n", rs)
  13. }
  14. func randomString(n int, alphabet []rune) string {
  15. alphabetSize := len(alphabet)
  16. var sb strings.Builder
  17. for i := 0; i < n; i++ {
  18. ch := alphabet[rand.Intn(alphabetSize)]
  19. sb.WriteRune(ch)
  20. }
  21. s := sb.String()
  22. return s
  23. }
英文:

You just need to define the alphabet that you're using. Something like the following (You can fiddle with it here in the Go Playground).

  1. package main
  2. import (
  3. &quot;fmt&quot;
  4. &quot;math/rand&quot;
  5. &quot;strings&quot;
  6. &quot;time&quot;
  7. )
  8. func main() {
  9. rand.Seed(time.Now().UnixNano())
  10. var alphabet []rune = []rune(&quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&quot;)
  11. rs := randomString(20, alphabet)
  12. fmt.Printf(&quot;This is pretty random: %s\n&quot;, rs)
  13. }
  14. func randomString(n int, alphabet []rune) string {
  15. alphabetSize := len(alphabet)
  16. var sb strings.Builder
  17. for i := 0; i &lt; n; i++ {
  18. ch := alphabet[rand.Intn(alphabetSize)]
  19. sb.WriteRune(ch)
  20. }
  21. s := sb.String()
  22. return s
  23. }

huangapple
  • 本文由 发表于 2022年3月16日 02:04:39
  • 转载请务必保留本文链接:https://go.coder-hub.com/71486991.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定