为了账号安全,请及时绑定邮箱和手机立即绑定

golang rand() 是否使用 libc rand()

golang rand() 是否使用 libc rand()

Go
一只斗牛犬 2023-06-01 17:24:03
我在 golang 和 C 中使用相同的种子,但得到不同的随机数我知道 php 使用 libc rand(),golang 怎么样?//golang:rand.Seed(12345); rand.Uint32();//C:srand(12345); rand();
查看完整描述

4 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

不,rand包根本不使用 C 标准库,您可以通过查看每个源文件来判断它不使用 CGO。

  • exp.go :

    import (
        "math"
        )
  • 正常.go

    import (    
        "math")
  • 随机数

    import "sync"
  • rng.go

    没有进口

  • zipf.go:

    import "math"


查看完整回答
反对 回复 2023-06-01
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

C 标准对以下行为施加了有限的要求rand()- 您通常得到的是具有合理周期性(与 相关RAND_MAX)的线性同余生成器,并srand允许您为该生成器播种

因此,即使使用相同的起始种子,它也没有理由返回与另一个线性同余生成器或其他方式相同的序列。

如果你想让你的跨语言生成器匹配,那么你可能想推出自己的。


查看完整回答
反对 回复 2023-06-01
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

我在 golang 和 C 中使用相同的种子,但得到不同的随机数我知道 php 使用 libc rand(),golang 怎么样?


//golang:

rand.Seed(12345); 

rand.Uint32();


//C:

srand(12345); 

rand();

C去随机的我已经通过 golang 实现了函数 rand 和 srand 。与 PHP/C 相比,它可以获得相同的结果。


package fcrypt


var index int

var r []int


func mysrand(seed int) {

    r = append(r, seed)

    for i := 1; i < 31; i++ {

        r = append(r, (16807*r[i-1])%2147483647)

        if r[i] < 0 {

            r[i] = r[i] + 2147483647

        }

    }

    for i := 31; i < 34; i++ {

        r = append(r, r[i-31])

    }

    for i := 34; i < 344; i++ {

        r = append(r, r[i-31]+r[i-3])

    }

}

func myrand() uint32 {

    i := 344 + index

    r = append(r, r[i-31]+r[i-3])

    index = index + 1

    return uint32(r[i]) >> 1

}


查看完整回答
反对 回复 2023-06-01
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

golang rand() 是否使用 libc rand()

不。


查看完整回答
反对 回复 2023-06-01
  • 4 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信