Go имеет два пакета для случайных чисел:
- math/rand реализует большой выбор генераторов псевдослучайных чисел.
- crypto/rand реализует криптографически безопасный генератор псевдослучайных чисел с ограниченным интерфейсом.
Два пакета можно объединить, вызвав rand.New в пакете math/rand с источником, который получает данные из crypto/rand.
import (
crand "crypto/rand"
rand "math/rand"
"encoding/binary"
"fmt"
"log"
)
func main() {
var src cryptoSource
rnd := rand.New(src)
// действительно случайное число от 0 до 999
fmt.Println(rnd.Intn(1000))
}
type cryptoSource struct{}
func (s cryptoSource) Seed(seed int64) {}
func (s cryptoSource) Int63() int64 {
return int64(s.Uint64() & ^uint64(1<<63))
}
func (s cryptoSource) Uint64() (v uint64) {
err := binary.Read(crand.Reader, binary.BigEndian, &v)
if err != nil {
log.Fatal(err)
}
return v
}
Предупреждение: crand.Reader возвращает ошибку в случае сбоя основного системного вызова. Например, если он не может прочитать /dev/urandom в системе Unix, или если CryptAcquireContext не работает в системе Windows.
Читайте также:
- Go Code Review Comments: Пакет Crypto Rand
- Что такое seed (начальное число, семя) в генераторе случайных чисел?
- Генерация случайных чисел, символов и элементов срезов в Golang
- Создать случайную строку (пароль) в Golang
Комментариев нет:
Отправить комментарий