dstbtam8732
dstbtam8732
2017-08-21 07:49
浏览 118
已采纳

如何从golang的数组中提取字符?

need to extract the random characters from string

here is what i got:

const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  b := make([]byte, 1)
for i := range b {
    b[i] = letterBytes[rand.Intn(len(letterBytes))]
}
fmt.Println(string(b))

but it always returns "X" but, i need to return every time new character using rand function. any help would be really appreciated. Thanks.

图片转代码服务由CSDN问答提供 功能建议

需要从字符串中提取随机字符

这是我得到的 :

  const letterBytes =“ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ” 
b:= make([] byte,1)
for i:=范围b {
b [i] = letterBytes [rand  .Intn(len(letterBytes))
} 
fmt.Println(string(b))
   
 
 

,但它始终返回“ X” 但是,我 需要每次使用rand函数返回新字符。 any的帮助将不胜感激。 谢谢。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • duan7772
    duan7772 2017-08-21 08:12
    已采纳

    Start by seeding the pseudorandom number generator. For example,

    package main
    
    import (
        "fmt"
        "math/rand"
        "time"
    )
    
    func main() {
        rand.Seed(time.Now().UnixNano())
        const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
        b := make([]byte, 7)
        for i := range b {
            b[i] = letterBytes[rand.Intn(len(letterBytes))]
        }
        fmt.Println(string(b))
    }
    

    Output:

    jfXtySC
    

    The Go Playground

    About the Playground

    In the playground the time begins at 2009-11-10 23:00:00 UTC (determining the significance of this date is an exercise for the reader). This makes it easier to cache programs by giving them deterministic output.

    Therefore, in the Go playground, time.Now().UnixNano() always returns the same value. For a random seed value, run the code on your computer.


    For any Unicode code point (Go rune),

    package main
    
    import (
        "fmt"
        "math/rand"
        "time"
    )
    
    package main
    
    import (
        "fmt"
        "math/rand"
        "time"
    )
    
    func main() {
        rand.Seed(time.Now().UnixNano())
        chars := []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ世界!@=")
        r := make([]rune, 50)
        for i := range r {
            r[i] = chars[rand.Intn(len(chars))]
        }
        fmt.Println(string(r))
    }
    

    Output:

    世QRYSp=@giJMIKly=tXRefjtVkeE!yHhTSQHvLyUYdRNIBbILW
    
    点赞 评论
  • dqzuo0327
    dqzuo0327 2017-08-21 08:11

    You probably don't need cryto/rand. Just set the seed to something different each time. The math/rand package is deterministic with the same seed, so you just need to change the seed each time. Assuming this is not super secure, just add this line.

    rand.Seed(time.Now().Unix())
    

    Also note if you're using play.golang.org to test it that's not going to work because the time pkg doesn't work there. It'll work fine anywhere else.

    If you actually want a random selection of characters though, use crypto/rand.Read NOT a homemade version - you can encode it if you need it within a given character range. Finally, don't roll your own crypto, just in case that's what you're doing here.

    点赞 评论

相关推荐