Golang范围内的随机数和给定的粒度

时间:2019-06-10 14:27:43

标签: go random granularity

我编写了以下代码来创建0.0到10.0之间的随机数。

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

但是,我想将粒度设置为0.05,因此不应将所有数字都设为最低有效十进制,而应仅允许使用0和5,例如:

  • 值7.73无效,
  • 值7.7和7.75有效。

如何在Go中生成此类数字?

2 个答案:

答案 0 :(得分:3)

您可以用粒度除以一个伪随机整数,然后与粒度相乘以缩小结果。

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

这将打印:

8.05
8.35
8.35
8.95
8.05
9.90
....

如果您不想每次rand.Seed(time.Now().UTC().UnixNano())都获得相同的顺序。

From the docs

  

Seed使用提供的种子值将默认Source初始化为确定性状态。如果未调用Seed,则生成器的行为就像由Seed(1)设置种子一样。除以2 ^ 31-1时具有相同余数的种子值会生成相同的伪随机序列。与Rand.Seed方法不同,种子可以安全地同时使用。

答案 1 :(得分:1)

下限

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

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