crypt/rand는math/rand로 사용

한 번도 생각해 본 적 없어요?왜 math/randcrypto/rand의 내부 구조가 완전히 다르죠?뭐, 목적이 다르기 때문에 구성이 다른 것도 이상하지 않지만, 적어도 crypto/randmath/rand의 소스로 사용하면 된다.
사실 crypto/randmath/rand로 만든 소스도 그리 어렵지 않다.math/rand의 소스는
math/rand/rand.go
// A Source represents a source of uniformly-distributed
// pseudo-random int64 values in the range [0, 1<<63).
type Source interface {
    Int63() int64
    Seed(seed int64)
}

// A Source64 is a Source that can also generate
// uniformly-distributed pseudo-random uint64 values in
// the range [0, 1<<64) directly.
// If a Rand r's underlying Source s implements Source64,
// then r.Uint64 returns the result of one call to s.Uint64
// instead of making two calls to s.Int63.
type Source64 interface {
    Source
    Uint64() uint64
}
따라서 그에 어울리는 호각을 만들면 된다.예를 들면 이런 느낌.
sample.go
type Source struct{}

// Seed method is dummy function for rand.Source interface.
func (s Source) Seed(seed int64) {}

// Uint64 method generates a random number in the range [0, 1<<64).
func (s Source) Uint64() uint64 {
    b := [8]byte{}
    ct, _ := rand.Read(b[:])
    return binary.BigEndian.Uint64(b[:ct])
}

// Int63 method generates a random number in the range [0, 1<<63).
func (s Source) Int63() int64 {
    return (int64)(s.Uint64() >> 1)
}
이렇게 하면
sample.go
fmt.Println(rand.New(Source{}).Float64()) // 0.9581627789424901
이런 느낌.Rand형이 제공하는 방법rand을 이용할 수 있다.코드 전체가 이런 느낌입니다.
sample.go
//go:build run
// +build run

package main

import (
    "crypto/rand"
    "encoding/binary"
    "fmt"
    mrand "math/rand"
)

type Source struct{}

// Seed method is dummy function for rand.Source interface.
func (s Source) Seed(seed int64) {}

// Uint64 method generates a random number in the range [0, 1<<64).
func (s Source) Uint64() uint64 {
    b := [8]byte{}
    ct, _ := rand.Read(b[:])
    return binary.BigEndian.Uint64(b[:ct])
}

// Int63 method generates a random number in the range [0, 1<<63).
func (s Source) Int63() int64 {
    return (int64)(s.Uint64() >> 1)
}

func main() {
    fmt.Println(mrand.New(Source{}).Float64())
}
그래서 포장하기로 했다.그럼에도 불구하고 이런 기능만을 위해 창고를 만드는 것은 아까워 졸작의 위조 랜덤수 포장[1]의 사은품 기능을 편입해 봤다.이런 느낌으로 쓸 수 있어.
좋아, 응, 좋아.그럼, 계속 일하세요.
github.com/spiegel-im-spiegel/mt
각주
https://text.baldanders.info/release/mersenne-twister-by-golang/ .Rand형이 제공하는 방법은 안전하지 않다는 것을 주의하십시오.rand

좋은 웹페이지 즐겨찾기