我在golang和C中使用相同的种子,但是获得了不同的rand号 我知道php使用libc rand(),那么golang呢?
//golang:
rand.Seed(12345);
rand.Uint32();
//C:
srand(12345);
rand();
答案 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
}