mirror of
https://github.com/jbranchaud/til
synced 2026-01-03 15:18:01 +00:00
50 lines
948 B
Markdown
50 lines
948 B
Markdown
# Deterministically Seed A Random Number Generator
|
|
|
|
If you need a random number in Go, you can always reach for the various
|
|
functions in the `rand` package.
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"math/rand"
|
|
)
|
|
|
|
func main() {
|
|
for range 5 {
|
|
roll := rand.Intn(6) + 1
|
|
fmt.Printf("- %d\n", roll)
|
|
}
|
|
}
|
|
```
|
|
|
|
Each time I run that, I get a random set of values. Often in programming, we
|
|
want some control over the randomness. We want to _seed_ the randomness so that
|
|
it is deterministic. We want random, but the kind of random where we know how
|
|
we got there.
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"math/rand"
|
|
)
|
|
|
|
func main() {
|
|
seed := int64(123)
|
|
src := rand.NewSource(seed)
|
|
rng := rand.New(src)
|
|
|
|
for range 5 {
|
|
roll := rng.Intn(6) + 1
|
|
fmt.Printf("- %d\n", roll)
|
|
}
|
|
}
|
|
```
|
|
|
|
In this second snippet, we create a `Source` with a specific seed value that we
|
|
can use with a custom `Rand` struct. We can then deterministically get random
|
|
numbers from it.
|