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

时间:2014-05-10 04:26:54

标签: 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)

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

5 个答案:

答案 0 :(得分:23)

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

rand.Intn(max - min) + min

答案 1 :(得分:5)

为了防止一遍又一遍地重复maxpackage 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)) } } ,我建议在考虑它时切换范围和随机。这是我发现按预期工作的方式:

min

See on Go Playground

指定范围

Cookbook中的solution you found未能准确指定max<MyButton text="Search" ... /> 的工作方式,但当然符合您的规范 [ - 最小,最大))。我决定将范围指定为闭区间( [ - min,max] ,而不是意味着它的边界包含在有效范围内)。与我对Cookbook描述的理解相比:

  

为您提供您指定的任意两个正数内的随机数(在本例中为1和6)。

(可以找到below the code snippet in the Golang Cookbook

Cookbook的实施是一个(这当然会带来很好的公司,有很多有用的项目,乍看之下)。

答案 2 :(得分:2)

我为编写随机切片而写的一个小实用程序(非常像python范围)

代码 - https://github.com/alok87/goutils/blob/master/pkg/random/random.go

import "github.com/alok87/goutils/pkg/random"
random.RangeInt(2, 100, 5)

[3, 10, 30, 56, 67]

答案 3 :(得分:0)

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

rand.Seed(time.Now().UnixNano())
n := a + rand.Intn(b-a+1)

source

答案 4 :(得分:0)

对我有用的解决方案是: j = rand.Intn(600) - 100 其中 m 是100, n 是500,它将生成-100到499之间的数字。