golang - 랜덤 seed 설정하기

출처: https://qiita.com/makiuchi-d/items/9c4af327bc8502cdcdce

시간을 seed로 설정하기

time.Now().UnixNano()를 사용한다.

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    rand.Seed(time.Now().UnixNano())
    fmt.Println(rand.Int63())
}

보안성이 높은 seed 사용하기

crypto/rand 패키지를 사용한다.

package main

import (
    crand "crypto/rand"
    "fmt"
    "math"
    "math/big"
    "math/rand"
)

func main() {
    seed, _ := crand.Int(crand.Reader, big.NewInt(math.MaxInt64))
    rand.Seed(seed.Int64())
    fmt.Println(rand.Int63())
}

메르센 트위스터 난수 생성기 사용하기

오픈 소스로 공개된 것을 사용한다.
https://github.com/seehuhn/mt19937

package main

import (
    crand "crypto/rand"
    "fmt"
    "math"
    "math/big"
    "math/rand"

    "github.com/seehuhn/mt19937"
)

func main() {
    seed, _ := crand.Int(crand.Reader, big.NewInt(math.MaxInt64))
    rng := rand.New(mt19937.New())
    rng.Seed(seed.Int64())
    fmt.Println(rng.Int63())
}

이 글은 2019-05-22에 작성되었습니다.