在Go中生成一个范围内的随机数

y0s*_*1an 20 random go

math/rand生成非负数的所有整数函数.

rand.Int() int              // [0, MaxInt]
rand.Int31() int32          // [0, MaxInt32]
rand.Int31n(n int32) int32  // [0, n)
rand.Int63() int64          // [0, MaxInt64]
rand.Int63n(n int64) int64  // [0, n)
rand.Intn(n int) int        // [0, n)
Run Code Online (Sandbox Code Playgroud)

我想生成[-m,n]范围内的随机数.换句话说,我想生成正数和负数的混合.

y0s*_*1an 26

我在Go Cookbook中找到了这个例子,它相当于rand.Range(min, max int)(如果存在该函数):

rand.Intn(max - min) + min
Run Code Online (Sandbox Code Playgroud)

  • @LekaBaper你需要使用`rand.Seed(time.Now().UnixNano())为随机数生成器播种. (4认同)
  • `rand.Intn(2 - 1) + 1` 将始终返回 1 (2认同)
  • 该问题要求提供 [min, max) 范围内的随机数。[1, 2) 范围内的唯一数字是 1。 (2认同)

Asa*_*lle 10

这将生成给定范围 [a, b] 内的随机数

rand.Seed(time.Now().UnixNano())
n := a + rand.Intn(b-a+1)
Run Code Online (Sandbox Code Playgroud)

来源


Wol*_*olf 5

为了防止重复min和反复max,我建议在考虑它时切换范围和随机.这是我发现按预期工作的内容:

package main

import (
    "fmt"
    "math/rand"
)

// range specification, note that min <= max
type IntRange struct {
    min, max int
}

// get next random value within the interval including min and max
func (ir *IntRange) NextRandom(r* rand.Rand) int {
    return r.Intn(ir.max - ir.min +1) + ir.min
}

func main() {
    r := rand.New(rand.NewSource(55))
    ir := IntRange{-1,1}
    for i := 0; i<10; i++ {
        fmt.Println(ir.NextRandom(r))
    }
}
Run Code Online (Sandbox Code Playgroud)

在Go Playground上看

指定范围

在Cookbook中找到解决方案未能准确指定工作方式minmax工作方式,但当然它符合您的规范([-min,max)).我决定将范围指定为闭区间([-min,max],而不是指其边界包含在有效范围内).与我对Cookbook描述的理解相比:

在您指定的任意两个正数内给出该随机数(在本例中为1和6).

(可以在Golang Cookbook的代码片段下面找到)

Cookbook的实施是一个接一个的(当然这会使它与良好的公司有很多方案,乍一看是有帮助的).

  • 很好,@Wolf--我注意到 Cookbook 示例存在同样的问题。(这应该有更多的选票,但赞成票的人似乎很久以前就离开了。) (2认同)