diff --git a/README.md b/README.md index f5dc373..43d2706 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ pairing with smart people at Hashrocket. For a steady stream of TILs, [sign up for my newsletter](https://crafty-builder-6996.ck.page/e169c61186). -_1545 TILs and counting..._ +_1546 TILs and counting..._ --- @@ -406,6 +406,7 @@ _1545 TILs and counting..._ - [Check If Cobra Flag Was Set](go/check-if-cobra-flag-was-set.md) - [Combine Two Slices](go/combine-two-slices.md) - [Detect If Stdin Comes From A Redirect](go/detect-if-stdin-comes-from-a-redirect.md) +- [Deterministically Seed A Random Number Generator](go/deterministically-seed-a-random-number-generator.md) - [Do Something N Times](go/do-something-n-times.md) - [Find Executables Installed By Go](go/find-executables-installed-by-go.md) - [Format Date And Time With Time Constants](go/format-date-and-time-with-time-constants.md) diff --git a/go/deterministically-seed-a-random-number-generator.md b/go/deterministically-seed-a-random-number-generator.md new file mode 100644 index 0000000..5cfba77 --- /dev/null +++ b/go/deterministically-seed-a-random-number-generator.md @@ -0,0 +1,49 @@ +# 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.