mirror of
https://github.com/jbranchaud/til
synced 2026-01-05 16:18:01 +00:00
47 lines
1.1 KiB
Markdown
47 lines
1.1 KiB
Markdown
# Not So Random
|
|
|
|
Go's `rand` package makes it easy to generate all sorts of random numbers.
|
|
What they don't tell you though is that the default seed is `1`. So if you
|
|
write a program like so:
|
|
|
|
```go
|
|
package main
|
|
|
|
import "fmt"
|
|
import "math/rand"
|
|
|
|
func main() {
|
|
stuff := []string{
|
|
"one",
|
|
"two",
|
|
"three",
|
|
"four",
|
|
}
|
|
fmt.Println(stuff[rand.Intn(len(stuff))])
|
|
}
|
|
```
|
|
|
|
and then run it, you will get output like:
|
|
|
|
```
|
|
three
|
|
```
|
|
|
|
and any subsequent runs of the program will continue to produce `three`. Not
|
|
exactly what we are looking for.
|
|
|
|
If you want your program to be a little less predictable, you will want to
|
|
seed it yourself, perhaps with the current time, instead of `1`. Try adding
|
|
the following to the beginning of the `main` function:
|
|
|
|
```go
|
|
rand.Seed( time.Now().UTC().UnixNano())
|
|
```
|
|
|
|
You'll also want to import the `time` package.
|
|
|
|
Things should *appear* to be a bit more random now.
|
|
|
|
source: [Jake Worth](https://twitter.com/jwworth) and
|
|
[Stackoverflow](http://stackoverflow.com/questions/12321133/golang-random-number-generator-how-to-seed-properly)
|