From ad8f04f0255d66917a0bfeae598046404e38b9b6 Mon Sep 17 00:00:00 2001 From: Rostislav Kuratch Date: Thu, 23 Jun 2022 21:08:43 +0300 Subject: [PATCH] "837. New 21 Game" medium, experiments with random numbers generation --- 837-new-21-game.go | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/837-new-21-game.go b/837-new-21-game.go index 2026055..dd6305a 100644 --- a/837-new-21-game.go +++ b/837-new-21-game.go @@ -246,7 +246,15 @@ func (rng *rngSource) Uint64() uint64 { return uint64(x) } -func new21GameExperimental(n int, k int, maxPts int) float64 { +type RngType int + +const ( + StandardRng RngType = iota + FastRng + AlwaysNewRng +) + +func new21GameExperimental(n int, k int, maxPts int, rngType RngType) float64 { generator := rngSource{} generator.Seed(time.Now().Unix()) rand.Seed(time.Now().Unix()) @@ -255,12 +263,21 @@ func new21GameExperimental(n int, k int, maxPts int) float64 { rndTable := [100000]uint64{} maxRandoms := maxPts * 10 - for i := 0; i < maxRandoms; i++ { - rndTable[i] = 1 + generator.Uint64()%mp + if rngType == FastRng { + for i := 0; i < maxRandoms; i++ { + rndTable[i] = 1 + generator.Uint64()%mp + } + } else { + for i := 0; i < maxRandoms; i++ { + rndTable[i] = 1 + uint64(rand.Int63n(int64(mp))) + } } nextRandom := 0 getNextRandom := func() uint64 { + if rngType == AlwaysNewRng { + return 1 + uint64(rand.Int63n(int64(mp))) + } res := rndTable[nextRandom] nextRandom++ if nextRandom >= maxRandoms { @@ -296,7 +313,7 @@ func new21GameExperimental(n int, k int, maxPts int) float64 { return float64(nOrLessCount) / float64(kOrMoreCount) } - stabilityThreshold := 100 + stabilityThreshold := 1000 precision := 0.00001 stability := 0 @@ -317,5 +334,5 @@ func new21GameExperimental(n int, k int, maxPts int) float64 { } func New21Game(n int, k int, maxPts int) float64 { - return new21GameExperimental(n, k, maxPts) + return new21GameExperimental(n, k, maxPts, FastRng) }