Использует ли golang rand () libc rand () - PullRequest
0 голосов
/ 21 января 2019

Я использую одно и то же семя в Голанге и С, но получаю другое число рандов Я знаю, PHP использует libc rand (), а как насчет Голанга?

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

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

Ответы [ 4 ]

0 голосов
/ 22 января 2019

Я реализовал функции rand и srand от golang.Он может получить тот же результат по сравнению с 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
}
0 голосов
/ 21 января 2019

Нет, пакет rand вообще не использует стандартную библиотеку C, что можно увидеть, посмотрев каждый исходный файл, чтобы убедиться, что он не использует CGO.

0 голосов
/ 21 января 2019

Стандарт C предъявляет ограниченные требования к поведению rand() - обычно вы получаете линейный конгруэнтный генератор с разумной периодичностью (относящийся к RAND_MAX), а srand позволяет вам seed этот генератор.

Так что нет причины, по которой он возвращал бы ту же серию, что и другой линейный конгруэнтный генератор, или иным образом, даже с тем же начальным начальным числом.

Если вы хотите, чтобы ваши межъязыковые генераторы совпали, то вы можете свернуть свои собственные.

0 голосов
/ 21 января 2019

Использует ли golang rand () libc rand ()

Нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...