bai57342172 2024-06-26 17:53 采纳率: 100%
浏览 4
已结题

关于go 随机函数宕机的疑问

go 随机数宕机

//获取一个随机数
func bairand(s, e int, s1 rand.Source) int {
    if s1 == nil {
        s1 = rand.NewSource(time.Now().UnixNano())
    }
    r1 := rand.New(s1)

    n := e - s + 1
    if n <= 0 {
        n = 10
    }
    r := r1.Intn(n) + s //这就是报错的行 D:/goxm/ttdyxdy/baifunction.go:736 +0x15a

    return r
}




报错信息:
goroutine 14222020 [running]:
runtime/debug.Stack()
        D:/Program Files/Go/src/runtime/debug/stack.go:24 +0x65
runtime/debug.PrintStack()
        D:/Program Files/Go/src/runtime/debug/stack.go:16 +0x19
main.dy_printactionfunxfun.func1()
        D:/goxm/ttdyxdy/function.go:1990 +0xec
panic({0xf998e0, 0xc006f0db30})
        D:/Program Files/Go/src/runtime/panic.go:844 +0x258
math/rand.(*rngSource).Uint64(...)
        D:/Program Files/Go/src/math/rand/rng.go:249
math/rand.(*rngSource).Int63(0x10?)
        D:/Program Files/Go/src/math/rand/rng.go:234 +0x92
math/rand.(*Rand).Int63(...)
        D:/Program Files/Go/src/math/rand/rand.go:84
math/rand.(*Rand).Int31(...)
        D:/Program Files/Go/src/math/rand/rand.go:98
math/rand.(*Rand).Int31n(0xc000a78fd0, 0x9)
        D:/Program Files/Go/src/math/rand/rand.go:133 +0x59
math/rand.(*Rand).Intn(0x69483230?, 0x10666b8?)
        D:/Program Files/Go/src/math/rand/rand.go:171 +0x2e
main.bairand(0x1, 0x9, {0x10666b8?, 0xc000103500?})
        D:/goxm/ttdyxdy/baifunction.go:736 +0x15a
main.dy_printactionfunxfun({_, _}, {{0x1cd, 0x1}, {0x172b6c, 0x1}, {{0xc000012a88, 0x6}, 0x1}, {{0x0, ...}, ...}, ...}, ...)
        D:/goxm/ttdyxdy/function.go:2094 +0xa19
created by main.dy_printactionfunx
        D:/goxm/ttdyxdy/main.go:115 +0x1172
程序崩溃了 runtime error: index out of range [-1]

不是每次都报错,大部分时间是没问题的,只是偶尔宕机

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-26 17:53
    关注

    引自免费微信小程序:皆我百晓生

    这个问题涉及到Go语言中的随机数生成器rand和它的源source接口。在某些情况下,当source被设置为nil时,可能会导致rand返回一个错误值。

    要解决这个问题,你需要确保每次调用rand.New()都传入一个非nilsource对象。例如,在上述代码片段中,可以将s1替换为一个不为nil的变量(比如s1 := rand.NewSource(time.Now().UnixNano()))。

    如果你仍然遇到问题,可能是由于其他原因引起的。在这种情况下,建议检查rand库的文档,看看是否有任何特定于Go版本的问题或API限制。此外,也可以尝试在不同的机器上运行相同的代码,以排除编译或运行环境的因素。

    代码实现如下:

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func main() {
    	s1 := rand.NewSource(time.Now().UnixNano())
    	r1 := rand.New(s1)
    
    	n := 10 // 示例:从0到10的随机整数
    	if n <= 0 {
    		n = 10
    	}
    
    	r := r1.Intn(n) + 1 // 修改这里,确保r1是一个有效的rand.RNG并包含一个源
    
    	fmt.Println(r)
    }
    

    这段代码首先创建了一个新的source对象,并将其传递给rand.New()函数。然后,它通过rand.New()函数生成一个随机数。这应该解决了你提到的随机数生成器可能宕机的问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 7月13日
  • 已采纳回答 7月5日
  • 创建了问题 6月26日

悬赏问题

  • ¥15 CCF-CSP 2023 第三题 解压缩(50%)
  • ¥30 comfyui openpose报错
  • ¥20 Wpf Datarid单元格闪烁效果的实现
  • ¥15 图像分割、图像边缘提取
  • ¥15 sqlserver执行存储过程报错
  • ¥100 nuxt、uniapp、ruoyi-vue 相关发布问题
  • ¥15 浮窗和全屏应用同时存在,全屏应用输入法无法弹出
  • ¥100 matlab2009 32位一直初始化
  • ¥15 Expected type 'str | PathLike[str]…… bytes' instead
  • ¥15 三极管电路求解,已知电阻电压和三级关放大倍数