TPPZ
TPPZ

Reputation: 4891

Random number within range and a given granularity in Golang

I've written the following code to create a random number between 0.0 and 10.0.

const minRand = 0
const maxRand = 10
v := minRand + rand.Float64()*(maxRand-minRand)

However, I would like to set the granularity to 0.05, so having all the digits as the least significant decimal should not be allowed, only 0 and 5 should be allowed, e.g.:

How can I produce such numbers in Go?

Upvotes: 0

Views: 1391

Answers (2)

georgeok
georgeok

Reputation: 5716

You can divide with the granularity, get a pseudo random integer and then multiply with the granularity to scale the result down.

const minRand = 8
const maxRand = 10
v := float64(rand.Intn((maxRand-minRand)/0.05))*0.05 + minRand
fmt.Printf("%.2f\n", v)

This will print:

8.05
8.35
8.35
8.95
8.05
9.90
....

If you don't want to get the same sequence every time rand.Seed(time.Now().UTC().UnixNano()).

From the docs

Seed uses the provided seed value to initialize the default Source to a deterministic state. If Seed is not called, the generator behaves as if seeded by Seed(1). Seed values that have the same remainder when divided by 2^31-1 generate the same pseudo-random sequence. Seed, unlike the Rand.Seed method, is safe for concurrent use.

Upvotes: 4

Kent
Kent

Reputation: 598

With lower bounds

const minRand = 0
const maxRand = 10
const stepRand = 0.05

v := float64(rand.Intn((maxRand-minRand)/stepRand))*stepRand + minRand
fmt.Printf("%.2f\n", v)

Upvotes: 1

Related Questions