1

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.

user2315104
  • 2,378
  • 7
  • 35
  • 54

2 Answers2

2

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
peterSO
  • 158,998
  • 31
  • 281
  • 276
0

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.

Kenny Grant
  • 9,360
  • 2
  • 33
  • 47