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

时间:2019-01-21 08:27:53

标签: c go random

我在golang和C中使用相同的种子,但是获得了不同的rand号 我知道php使用libc rand(),那么golang呢?

//golang:
rand.Seed(12345); 
rand.Uint32();

//C:
srand(12345); 
rand();

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

C标准对rand()的行为提出了有限的要求-通常,您得到的是具有合理周期性(与RAND_MAX相关)的线性同余生成器,并且srand允许您种子那个生成器。

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

如果您希望您的中间语言生成器匹配,那么您可能需要自己使用。

答案 2 :(得分:1)

  

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

否。

答案 3 :(得分:1)

我已经通过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
}