rand64 패키지는 [0, 2 64 ) 범위의 부호 없는 64비트 숫자를 생성하는 의사 난수 생성기를 제공합니다.
다음 의사 난수 생성기에 대한 구현은 자체 패키지로 제공됩니다.
이러한 생성기는 rand.Source64를 구현하므로 rand.Rand의 소스로 사용할 수 있습니다(Go 1.8 기준).
일부 알고리즘은 Go 1.9의 비트 패키지를 사용합니다.
PRNG 생성은 다음과 같습니다.
// create a source with the xoshiro256**
source := &xoshiro.Rng256SS{}
// use it as a source in rand.New
rng := rand.New(&source)
// Seed it from a single int64 (negative values are accepted)
rng.Seed(int64Seed)
이는 Java 8의 SplittableRandom 생성기의 고정 증가 버전입니다. 빠른 분할 가능 의사 난수 생성기 페이지도 참조하세요.
Sebastiano Vigna의 C 참조 구현을 기반으로 한 Go 구현입니다.
기간 2 256 -1
알고리즘 작성자에 따르면:
xoshiro256**(XOR/shift/rotate)은 다용도의 견고한 생성기입니다(암호적으로 안전한 생성기는 아닙니다). 이는 뛰어난(ns 이하) 속도와 모든 병렬 애플리케이션에 충분히 큰 상태 공간(256비트)을 가지며 우리가 알고 있는 모든 테스트를 통과합니다.
그러나 64비트 부동 소수점 숫자만 생성해야 하는 경우(상위 53비트를 추출하여) xoshiro256+는 유사한 통계 속성을 가진 약간(약 15%) 더 빠른 생성기입니다. 일반적인 사용의 경우 가장 낮은 비트의 선형 복잡성이 낮고 선형성 테스트에 실패한다는 점을 고려해야 합니다. 그러나 낮은 선형 복잡도는 실제로 거의 영향을 미치지 않으며 상위 비트를 사용하여 부동 소수점 숫자를 생성하는 경우 전혀 영향을 미치지 않습니다(우리는 가장 낮은 비트의 선형 복잡도에 대한 정확한 추정치를 계산했습니다).
2주기 128 -1
알고리즘 작성자에 따르면:
xorshiro128** (XOR/rotate/shift/rotate) 및 xorshiro128+는 xoshiro256과 속도가 같고 공간의 절반을 사용합니다. 동일한 의견이 적용됩니다. 소규모 병렬 애플리케이션에만 적합합니다. 또한 xoroshiro128+는 테스트에서 5TB 출력 이후 오류를 생성하는 Hamming 가중치에 약간의 종속성을 나타냅니다. 우리는 이러한 약간의 편견이 어떤 응용 프로그램에도 영향을 미칠 수 없다고 믿습니다.
David Blackman과 Sebastiano Vigna의 C 참조 구현을 기반으로 한 Go 구현입니다.
자세한 내용은 xoshiro/xoroshiro 발전기 및 PRNG 총격전 페이지를 참조하세요.
2교시 128
이는 다음에 정의된 순열 합동 생성기입니다.
PCG: 난수 생성을 위한 간단하고 빠른 공간 효율적이고 통계적으로 우수한 알고리즘 제품군
멜리사 E. 오닐(Melissa E. O'Neill), 하비 머드 칼리지
https://www.cs.hmc.edu/tr/hmc-cs-2014-0905.pdf
PCG
전체 알고리즘 제품군을 참조하지만(http://pcg-random.org 참조) 제공되는 유일한 알고리즘은 PCG XSL RR 128/64 LCG입니다.
Melissa O'Neill과 PCG 프로젝트 기여자의 C 참조 구현을 기반으로 Go 구현을 수행합니다.
기간 2 19937 -1
이는 Makoto Matsumoto와 Takuji Nishimura의 mt19937-64.c C 구현을 기반으로 한 순수 Go 구현입니다.
Mersenne Twister 알고리즘 및 기타 구현에 대한 자세한 내용은 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html에서 확인할 수 있습니다.
이 알고리즘은 동일한 알고리즘을 사용하는 다른 응용 프로그램과의 상호 운용성이 필요한 응용 프로그램에만 사용됩니다. 사소한 통계 테스트에 실패하고 amd64에서 가장 느린 것으로 알려져 있으므로 다른 목적으로 사용하는 것은 권장되지 않습니다.
실제 PRNG가 아닙니다.
IoRand 패키지는 io.Reader를 통해 바이트 스트림을 읽기 위한 간단한 래퍼입니다. math/rand 패키지용 rand.Source64를 구축하기 위해 crypto/rand 주위의 래퍼로 사용할 수 있습니다.
package main
import (
"bufio"
crand "crypto/rand"
"encoding/binary"
"math/rand"
"github.com/db47h/rand64/v3/iorand"
)
// Wrap crypto/rand in an IoRand
func main () {
// first, wrap crypto/rand.Reader in a buffered bufio.Reader
bufferedReader := bufio . NewReader ( crand . Reader )
// Create the new IoRand Source
ior := iorand . New ( bufferedReader , binary . LittleEndian )
// use it as rand.Source64
rng := rand . New ( ior )
// get random numbers...
for i := 0 ; i < 4 ; i ++ {
_ = rng . Uint64 ()
}
}
이 벤치마크는 go 1.12.5에서 수행되었습니다.
연산 | AMD FX-6300 | 코어 i5 6200U | ARM Cortex-A7 @900MHz |
---|---|---|---|
xoshiro256** | 5.53ns/작업 | 106.0ns/작동 | |
xoshiro256+ | 5.48ns/작동 | 86.1ns/작동 | |
xoroshiro128** | 5.16ns/작동 | 79.2ns/작동 | |
xoroshiro128+ | 5.15ns/작동 | 62.7ns/작동 | |
PCG XSL RR 128/64 LCG | 5.29ns/작동 | 254.0ns/작동 | |
스플리트믹스64 | 4.30ns/작업 | 77.5ns/작동 | |
메르센 트위스터 19937 | 8.82ns/작업 | 136.0ns/작동 | |
수학/랜드로 가세요 | 7.01ns/작동 | 68.4ns/작동 |
벤치마크에서는 이전 릴리스에 비해 성능이 저하된 것으로 나타났습니다. 이는 rand.Rand64 인터페이스를 거치지 않고 Rng.Uint64를 직접 호출했기 때문입니다. Go 표준 라이브러리의 rng와 공정한 비교를 수행하기 위해 이제 모든 벤치마크는 rand.Source64 인터페이스를 거칩니다.
Splitmix64와 유명한 Mersenne-Twister 19937을 멀리하세요.
Go의 math/rand(여기, 여기 참조)에 대해서는 알려진 바가 거의 없으며 이를 PCG 생성기로 대체하자는 제안이 있습니다.
제공된 PCG인 xoshiro256** 및 xorshiro128**은 알려진 모든 테스트를 통과한 것으로 알려져 있습니다. 각각의 저자에 따르면. 하지만 32비트 플랫폼에서 이 특정 PCG 알고리즘의 성능 저하에 주의하세요(ARM과 x86 모두에 영향을 미침).
rand64는 go 모듈을 지원합니다. 이전 버전 1.x 및 2.x는 해당 분기로 이동되었습니다. go.mod가 없는 semver 태그는 go 모듈을 혼란스럽게 하는 것처럼 보이므로 해당 버전의 태그가 재설정되었습니다.
이 패키지는 ISC 라이선스 조건에 따라 출시됩니다(저장소 루트에 있는 LICENSE 파일 참조). 또한 다음 알고리즘의 사용에는 추가 라이선스가 적용됩니다.