0

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.:

  • the value 7.73 is NOT VALID,
  • the values 7.7 and 7.75 ARE VALID.

How can I produce such numbers in Go?

georgeok
  • 5,321
  • 2
  • 39
  • 61
TPPZ
  • 4,447
  • 10
  • 61
  • 106

2 Answers2

4

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.

georgeok
  • 5,321
  • 2
  • 39
  • 61
1

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)
Kent
  • 568
  • 4
  • 12