package main

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

func genRandNums(min, max float64) []float64 {
    var randNums []float64
    s := rand.NewSource(time.Now().Unix())
    r := rand.New(s)
    for x := 0; x < 10; x++ {
        // generate random float in range of min and max inclusive, append
        // to randNums and return randNums
    }
    return randNums
}

func main() {
    nums := genRandNums(1.10, 101.98)
    fmt.Println(nums)
}

我曾try 在网上搜索如何实现这一点,但我只找到了如何生成一个范围内的随机整数.有没有办法用Go stdlib在一定范围内生成随机浮动?

推荐答案

只需使用rand.Float64()即可获得[0..1)范围内的随机数,您可以将其映射(投影)到[min..max)范围,如下所示:

r := min + rand.Float64() * (max - min)

不要在您的函数中创建新的rand.Rand和/或rand.Source,只需创建全局rand.Rand和/或rand.Source或使用math/rand个包中的全局rand.Rand和/或rand.Source即可.但是不要忘记初始化它一次.

下面是一个执行此操作的示例函数:

func randFloats(min, max float64, n int) []float64 {
    res := make([]float64, n)
    for i := range res {
        res[i] = min + rand.Float64() * (max - min)
    }
    return res
}

使用它:

func main() {
    rand.Seed(time.Now().UnixNano())
    fmt.Println(randFloats(1.10, 101.98, 5))
}

输出(在Go Playground上试用):

[51.43243344285539 51.92791316776663 45.04754409242326 28.77642913403846
    58.21730813384373]

Some notes:

  • 围棋操场上的代码将始终给出相同的随机数字(时间是固定的,因此最有可能的情况是种子总是相同的,输出也会被缓存)
  • 上述解决方案对于并发使用是安全的,因为它使用rand.Float64(),使用全局rand,这是安全的.如果您使用rand.NewSource()获得的源创建自己的rand.Rand,这将不安全,randFloats()也不会使用它.

Go相关问答推荐

Golang读写更接近于io.File

向路由发送获取请求时Golang中出现404错误

杜松子wine -戈尼克背景在 children 围棋例行公事中被取消

消费者在NAT中是如何实现的

Golang html/模板&需要错误数量的参数1在模板中使用';调用';获得0&q;

即使HTTP服务器正在使用GO和Protobuf、SQL Server启动,请求也不返回结果

在Golang中Mergesort的递归/并行实现中出现死锁

为什么标准库中的 IsSorted 会反向迭代切片?

在 Windows 11 上运行 go mod tidy 时的 gitlab 权限问题

用于提取 <*n 的正则表达式(其中 n 是一个数字)

从Go中的随机日期开始以天为单位获取时间

为什么互斥量比 golang 中的通道慢?

使用 golang 生成 vim

从数据库中带有 imageurl 的文件夹中获取图像,并在我的浏览器中用 golang 中的 echo 显示

CORS grpc 网关 GoLang

为什么时间很短.睡眠时间比基准测试中要求的(约 300 ns)长?

显示作为服务帐户身份验证的谷歌日历事件 - Golang App

如何排除溢出矩阵的坐标

如何在 Gorm 中获得特定日期的最大值?

在 VSCode 中使用命令行参数调试 Go 测试