mirror of
https://github.com/jbranchaud/til
synced 2026-01-03 07:08:01 +00:00
Add Not So Random as a go til.
This commit is contained in:
46
go/not-so-random.md
Normal file
46
go/not-so-random.md
Normal file
@@ -0,0 +1,46 @@
|
||||
# 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)
|
||||
Reference in New Issue
Block a user