在Go语言中生成随机数

aamkag61  于 2022-12-07  发布在  Go
关注(0)|答案(5)|浏览(265)

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)**范围内的随机数。换句话说,我想生成一个正数和负数的混合。

b1zrtrql

b1zrtrql1#

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

rand.Intn(max - min) + min

不要忘记在调用任何rand函数之前植入PRNG。

rand.Seed(time.Now().UnixNano())
ocebsuys

ocebsuys2#

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

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

source

esbemjvw

esbemjvw3#

为了防止minmax一遍又一遍地重复,我建议在考虑时切换range和random。这是我发现的预期工作方式:

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))
    }
}

See on Go Playground

指定范围

Cookbook中的solution you found没有准确说明minmax是如何工作的,但它满足您的规范[-min,max))。我决定将范围指定为封闭区间([-min,max],这意味着它的边界包含在有效范围内)。与我对Cookbook描述的理解相比:
会在您指定的任意两个正数(在本例中为1和6)之间给出该随机数。
(可在below the code snippet in the Golang Cookbook中找到)
Cookbook实现相差一个(这当然使它与许多初看起来很有帮助的程序有很好的合作关系)。

nhjlsmyf

nhjlsmyf4#

我写的一个生成随机切片的小工具(非常像python range)
代码-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]
kxkpmulp

kxkpmulp5#

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

相关问题