4 回答

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊
不,rand包根本不使用 C 標(biāo)準(zhǔn)庫,您可以通過查看每個(gè)源文件來判斷它不使用 CGO。
exp.go?:
import?( ????"math" ????)
正常.go
import?(???? ????"math")
隨機(jī)數(shù)
import?"sync"
rng.go
沒有進(jìn)口
zipf.go:
import?"math"

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超8個(gè)贊
C 標(biāo)準(zhǔn)對以下行為施加了有限的要求rand()
- 您通常得到的是具有合理周期性(與 相關(guān)RAND_MAX
)的線性同余生成器,并srand
允許您為該生成器播種。
因此,即使使用相同的起始種子,它也沒有理由返回與另一個(gè)線性同余生成器或其他方式相同的序列。
如果你想讓你的跨語言生成器匹配,那么你可能想推出自己的。

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊
我在 golang 和 C 中使用相同的種子,但得到不同的隨機(jī)數(shù)我知道 php 使用 libc rand(),golang 怎么樣?
//golang:
rand.Seed(12345);
rand.Uint32();
//C:
srand(12345);
rand();
C去隨機(jī)的我已經(jīng)通過 golang 實(shí)現(xiàn)了函數(shù) rand 和 srand 。與 PHP/C 相比,它可以獲得相同的結(jié)果。
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
}
- 4 回答
- 0 關(guān)注
- 194 瀏覽
添加回答
舉報(bào)