在Go中生成随机数

Chr*_*nch 29 random go

我试图在Go中生成随机数(整数),但无济于事.我找到了randcrypto/rand,这似乎是我想要的,但我无法从文档中看出如何使用它.这就是我现在正在尝试的:

    b := []byte{}
    something, err := rand.Read(b)
    fmt.Printf("something = %v\n", something)
    fmt.Printf("err = %v\n", err)
Run Code Online (Sandbox Code Playgroud)

但不幸的是,这总是输出:

    something = 0
    err = <nil>
Run Code Online (Sandbox Code Playgroud)

有没有办法解决这个问题,以便它实际生成随机数?或者,有没有办法设置这个生成的随机数的上限?

Eva*_*haw 27

根据您的使用情况,另一个选项是math/rand包.如果您生成的数字需要完全不可预测,请不要这样做.如果您需要获得可重现的结果,这可能会有所帮助 - 只需传入您第一次传递的相同种子.

这是经典的"使用当前时间生成发电机并生成数字"程序:

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    rand.Seed(time.Now().Unix())
    fmt.Println(rand.Int())
}
Run Code Online (Sandbox Code Playgroud)


Pio*_*zmo 24

crypto/rand仅提供随机数据的二进制流,但您可以使用encoding/binary以下方法从中读取整数:

package main

import "encoding/binary"
import "crypto/rand"

func main() {
    var n int32
    binary.Read(rand.Reader, binary.LittleEndian, &n)
    println(n)
}
Run Code Online (Sandbox Code Playgroud)

  • @Karlom 输出由该站点缓存。它不会再次重新运行相同的程序。 (2认同)

Ibo*_*lit 16

截至2012年4月1日,在发布稳定版本的lang之后,您可以执行以下操作:

package main

import "fmt" import "time" import "math/rand"

func main() { rand.Seed(time.Now().UnixNano()) // takes the current time in nanoseconds as the seed fmt.Println(rand.Intn(100)) // this gives you an int up to but not including 100 }