랜덤 변량 생성 알고리즘을 테스트하기 위해 어떤 방법을 사용합니까?
랜덤 변량 생성 알고리즘을 테스트하기 위해 어떤 방법을 사용합니까?
답변:
의 Diehard 테스트 스위트는 난수 생성기를 테스트하기위한 황금 표준에 가까운 무언가이다. 여기에는 우수한 난수 생성기가 테스트를 거친 생성기를 사용한 결과를 비교할 수있는 일부 알려진 분포에 따라 분포 된 결과를 생성해야하는 여러 테스트가 포함됩니다.
편집하다
Diehard는 여전히 많게 사용될 수 있지만 더 이상 최신 기술이 아니며 더 이상 유지 관리되지 않습니다. NIST는 그 이후 로 일련의 개선 된 테스트를 내놓았습니다.
Honk 의 답변에 약간을 추가하기 위해 Diehard Test Suite (George Marsaglia에서 개발)는 PRNG의 표준 테스트입니다.
이러한 테스트에 액세스 할 수 있는 멋진 Diehard C 라이브러리 가 있습니다. 표준 Diehard 테스트뿐만 아니라 비트 순서 검사와 관련된 다른 PRNG 테스트를위한 기능도 제공합니다. RNG의 속도를 테스트하고 자체 테스트를 작성하는 기능도 있습니다.
Dieharder 라이브러리에 RDieHarder 라는 R 인터페이스가 있습니다 .
library(RDieHarder)
dhtest = dieharder(rng="randu", test=10, psamples=100, seed=12345)
print(dhtest)
Diehard Count the 1s Test (byte)
data: Created by RNG `randu' with seed=12345,
sample of size 100 p-value < 2.2e-16
이는 RANDU RNG 생성기가 최소 거리 / 2dsphere 테스트에 실패 했음을 나타냅니다 .
난수 생성기에서 생성 된 숫자를 테스트하기 위해 Diehard 테스트 는 실용적인 접근 방식입니다. 그러나 이러한 테스트는 임의적 인 것처럼 보이며 더 많은 것이 포함되어야하는지 또는 실제로 무작위성을 확인할 수있는 방법이 있는지 궁금해 할 수 있습니다.
랜덤 시퀀스의 정의에 가장 적합한 후보는 Martin-Löf 랜덤 성인 것 같습니다 . 이러한 종류의 난 수성에 대한 주요 아이디어는 Knuth 3.5 섹션 에서 아름답게 개발되었으며 난수 시퀀스의 모든 하위 시퀀스 유형에 대해 균일 성을 테스트하는 것입니다. 계산의 개념을 사용하더라도 모든 유형의 하위 시퀀스 정의를 올바르게 얻는 것은 실제로 어렵다는 것이 밝혀졌습니다.
Diehard 테스트는 고려할 수있는 가능한 하위 시퀀스 중 일부일 뿐이며 실패하면 Martin-Löf 임의성을 배제합니다.
불가능하기 때문에 증명할 수 없습니다. 당황스러운 자기 상관이나 분포 장애가 없는지 확인할 수 있으며 실제로 다이 하드 가 표준입니다. 이것은 통계 / 물리학을위한 것입니다. 암호화 전문가는 주로 미래의 가치를 얻기 위해 생성기에 데이터를 맞추는 것이 얼마나 어려운지 주로 확인합니다.
Colin의 게시물에 대한 작은 수정 : CRAN 패키지 RDieHarder 는 DieHarder 에 대한 인터페이스 이며 Robert G. Brown이 수행 한 Diehard 재 작성 / 확장 / 분해 (David Bauer의 최근 기여와 함께 RDieHarder 래퍼를 기반으로 한 공동 저자로 친절하게 나열합니다)입니다.
무엇보다도 DieHarder에는 Mark의 게시물에 언급 된 NIST 배터리 테스트 와 새로운 배터리가 포함 됩니다. 이것은 지속적인 연구이며 한동안 계속되었습니다. 나는 useR에서 이야기를했다! 여기 에서 얻을 수있는 RDieHarder에 대한 2007 .
난수 생성기를 테스트하는 데는 두 가지 부분이 있습니다. 균일 한 발전기 테스트에만 관심이 있다면 DIEHARD 테스트 스위트와 같은 것이 좋습니다.
그러나 종종 균일 한 발전기의 변형을 테스트해야합니다. 예를 들어, 균일 생성기를 사용하여 지수 또는 정규 분포 값을 생성 할 수 있습니다. Mersenne Twister와 같이 잘 알려진 알고리즘의 신뢰할 수있는 구현이 있다고 가정하면 고품질의 균일 한 생성기가있을 수 있지만 변환 된 출력에 올바른 분포가 있는지 테스트해야합니다. 이 경우 Kolmogorov-Smirnov와 같은 적합도 테스트를 수행해야합니다. 그러나 우선, 표본 평균과 분산에 기대 한 값이 있는지 확인할 수 있습니다.
대부분의 사람들은 처음부터 자신의 균일 난수 생성기를 작성하지 않습니다. 좋은 생성기를 작성하는 것은 어렵고, 자신이 작성하지 않았을 때 좋은 생성기를 작성했다고 생각하기 쉽다. 예를 들어, 도널드 크 누스는 자신이 쓴 난수 생성기의 TAOCP 2 권 에서 끔찍한 것으로 밝혀졌습니다. 그러나 사람들이 새로운 분포에서 임의의 값을 생성하기 위해 자신의 코드를 작성해야하는 것이 일반적입니다.
NIST 통계적 테스트 목록을 발행 C.의 기준 구현
존경받는 PRNG 연구원 인 Pierre L' Ecuyer를 포함한 일부 똑똑한 사람들의 TestU01 도 있습니다 . 다시, C에는 참조 구현이 있습니다.
다른 주석가들이 지적한 바와 같이, 이들은 의사 랜덤 비트의 생성을 테스트하기위한 것입니다. 이 비트를 다른 임의의 변수로 변환하는 경우 (예 : Box-Muller가 균일에서 보통으로 변환) 변환 알고리즘의 정확성을 확인하기 위해 추가 테스트가 필요합니다.