을 고려하는 방법은 무작위로 셔플의 요소를 배열입니다. 어떻게 당신이 쓰는 간단하면서도 강력한 단위 테스트하는지 확인 작동?
나는've 올 두 가지 아이디어,모두가 눈에 띄는 결함:
-셔플 배열,다음었는지 확인하기 위해서 다릅니다. 이 소리는 좋지만,실패할 경우 셔플 일어나는 셔플에서 같은 순서입니다. (황당한이지만,가능하다.) -셔플 배열을 가진 일정한 종자 및 확인에 대해 그것을 일정 출력됩니다. 이에 의존하는 임의의 기능을 항상 반환한 값과 동일 동일한 종자. 그러나,이것은때오잘못 가정.
고려 두 번째 함수를 시뮬레이션하는 주사위 롤과를 반환하고 무료로 액세스 할 수 있습니다. 어떻게 이것을 시험하는 기능입니까? 당신은 어떻게 테스트하는 기능을...
-반환하지 않을 수 밖에 주어진 경계는? -반품 번호에서 유효한가? (유니폼에 대한 하나의 죽습니다,정상적인 대형 숫자의 주사위입니다.)
나는'm 대한 답을 찾기에 대한 통찰력을 제공하는 테스트뿐만 아니라 이러한 예 하지만 요소를 임의의 코드를 일반적이다. 은 장치도 테스트를 여기에 적합한 솔루션? 하지 않을 경우,어떤 종류의 시험은?
그냥 쉽게 모두가's mind I'mnot쓰는 내 자신의 임의의 번호 생성기입니다.
I don't 생각한 단위 테스트는 올바른 도구 테스트를 위해성. 단위 테스트해야 호출 방법 및 시험 반환된 값(또는 개체 상태)에 대하여 예상되는 값입니다. 문제 테스트 임의성이 아니라는 것't 예상되는 가치에 대한 대부분의 것들을 너'd 을 시험합니다. 할 수 있는 테스트는 주어진 씨앗,하지만 그만검반복성. 그't 을 줄 당신은 어떤 방법으로 측정하는 방법**임의의분포,또는's 심지어 임의의에서 모두.
다행히도,많은 통계적 테스트를 실행할 수 있습니다 같은철저한 배터리 테스트의 난수의. 도 참조하십시오:
어떻게 유닛 테스트는 의사 난수를 발? -스티브 제솝는 것이 좋은 당신이 찾 테스트의 구현을 같은 레베카는 알고리즘'다시 사용하고 비교하는 출력으로 선택된 씨앗에 대하여 자신의 구현합니다. -그렉 Hewgill을 권장합ENTsuite 의 통계적 테스트합니다. -John D.Cook의미는 독자들이 자신의 CodeProject 문서단순한 임의의 숫자를 세대,는 구현을 포함합 Kolmogorov-Smirnov 테스트에 언급된 도널드 Knuth's volume2,Seminumerical 알고리즘이 있습니다. -여러 사람들을 테스트하는 것이 좋습 배포의 숫자가 생성되는 유니폼,카이 제곱 테스트,그리고 테스트하는 평균과 표준편차는 예상된 범위 내에서. (주는 테스트는 배포만으로는 충분하지 않습니다. [1,2,3,4,5,6,7,8]은 균일하게 배포하지만,그's 확실히지 않다.)
단위 테스트 가 반환하는 함수 임의의 결과 -브 Genisio는 조롱의 레베카는 옵션 중 하나를 만들기 위한 당신의 테스트를 반복적,제공하는 C#예제 코드입니다. -시,여러 더 많은 사람들이 지점을 사용하여 종자 수정 값에 대한 반복성과 간단한 테스트를 위한 균일 한 분포,카이 제곱,etc.
[단위험성](http://c2.com/cgi/wiki?UnitTestingRandomness 이)는 위키 문서에 대해 이야기 많은 문제의 이미 만졌을 때도하는 테스트는,그것의 성격에 의하여하지 않는 몇 가지 이점은 다음과 같습니다. 하나의 재미있는 비트는 나에서 얻은 그 다음과 같다:
I've seen 윈집 도구로 사용을 측정하는 임의의 파일의 값 앞에(물론,작은 파일을 압축할 수 있습 덜 무작위 it).
을 위한 첫 번째 질문을 구축 할 것이라는 가짜는 클래스를 공급하는 시퀀스의 임의의 번호는 당신이 알고의 결과를 알고리즘이 있습니다. 는 방법을 확인하는 알고리즘 구축최고당신의 임의의 기능을 작동합니다. 그래서 뭔가의 라인을 따라:
Random r = new RandomStub([1,3,5,3,1,2]);
r.random(); //returns 1
r.random(); //returns 3
...
단위 테스트해야 합 추가 테스트는 여러 번 실행하고 주장하는 결과
-에서의 경계를 설정한다(그래서,주사위 목록은 1~6)
쇼 합리적인 배포(여러스 테스트 실행하면 유통은 내 x 의 예상,예를 들어 주사위 목록이 표시되어야 합2
올 10%~20%(1/6=16.67%)의 주어진 시간을 압연 그것은 1000 배).
얼마나 자주 당신이 기대 배열로 정렬된 원래 분류? 종류의 몇 백 배고 주장하는 것만×%시간의 분류는 변경되지 않습니다.
이것은 실제로 이미 통합 테스트를 테스트하는 알고리즘과 함께 임의의 기능입니다. 일단 당신이 사용하여 실제 임의로 기능할 수 있't 리 하나의 테스트 실행이 더 이상입니다.
에서 경험(썼 유전자 알고리즘의)내가 말할 것을 결합한 단위 테스트의 알고리즘,분포의 테스트 임의의 기능 및 통합 테스트 방법입니다.
의 측면 PRNGs 는 것에 대해 잊는 그것의 모든 속성은 통계 자연에서:할 수 있't 을 기대하는 셔플링 배열에 다른 순열에서 하나 당신 시작했다. 기본적으로 사용하는 경우 정상적인 PRNG,유일한 것은 당신이'다시 보는't 를 사용하여 간단한 패턴(희망)하고 그것도들에게 도움이 될 수 있도록 합니다 집의 숫자는 그것을 반환합니다.
적절한 테스트를 위해 PRNG 을 포함 할 것이다 그것을 실행하는 적어도 100 번 다음 확인 메일 출력(직접적인 응답이 두 번째 부분의 질문에).
는 첫 번째 질문에 대한 답변은 거의 동일한 실행에 대한 시험 100 시간{1,2,...,n}과 횟수를 계산하고 각 요소에 각각 위치입니다. 그들은 모두가 대략 동등한 경우에는 셔플은 방법은 어떤 좋습니다.
전혀 다른 문제를 테스트하는 방법을 암호화 등급 PRNGs. 이 문제는 당신은 아마 안't 거하지 않는 한,당신은 정말 무엇을 하고 있다. 사람들이 알려져 왔다파괴(읽기:열려있는 치명적인 구멍)좋은자의 욕구와 함께 몇 가지'최적화'거나 사소한 편집 작업을 합니다.
편집:가 철저하게 다시 질문을,상단에 대답하고 나 자신입니다. 하는 동안 포인트 내가 여전히 서있다,나는 두번째 법안 도마뱀's answer. 단위 테스트 Boolean 에서 자신의 자연을 그들 중 하나 실패,또는 그들은 성공하므로 알맞지 않은 테스트를 위한"얼마나 좋"재산의 PRNG(또는 방법을 사용하여 PRNG),기 때문에 이 질문에 대답 것 양이 많기보다는,북극곰.
두 가지 부분이 테스트 임의화 및 테스트하여 사용하는 것 무작위.
테스트 랜덤은 상대적으로 간단합니다. 당신은 확인 하는 기간의 임의의 번호 생성기입니다 당신이 그것을 기대(에 대한 몇 가지 견본을 사용하여 몇 가지 좀-임의의 씨앗,내부 임계 값)와 그 분포의 출력 이상 큰 샘플 크기는 당신이 그것을 기대하는(내부 threshold).
을 테스트하여 사용하는 것 무작위는 것이 가장 좋으로 결정적인비-임의의 번호 생성기입니다. 이후 출력의 랜덤진에 기반한 종자(입력),할 수 있습니다 다음 단위 테스트는 정상적으로 입력에 따라 대상 출력이 있습니다. 하는 경우 RNG 발견을 결정적,다음 모의하는 것으로 결정적(또는 단순히 임의하지 않음). 테스트 랜덤에서 격리된 코드에서는 소모니다.
에 의지할 수 있는 안전한 난수를 발생기
나는 그냥 무서 생각:you'다시 쓰지 않는 자신의 임의의 번호 생성기는가?
가정'되지 않음코드를 테스트하는 당신이에 대한 책임,다른 사람들이's 코드(이하SecureRandom
구현에 대한 귀하의 프레임워크).
테스트 코드
을 테스트하는 코드를 제대로 응답하는,그것은 정상적인 사용하여 낮은 표시 방법을 생산하는 임의의 숫자를할 수 있도록 쉽게 재정의하여 단위 테스트 클래스입니다. 이 재정의하는 방법을 효과적으로 조롱의 난수를 발생기와 완전히 제어할이 무엇이 생성 되는 경우도 있습니다. 따라서 당신은 완전히 운동하는 코드의 목표입니다 단위 테스트입니다.
분명히 당신을 확인합니다 가장자리에 조건을 보장하는 셔플치로 정확하게 알고리즘을 지시어 적절한 입력을 사용합니다.
테스트 보안 random number generator
확신이 서지 않는 경우는 안전한 임의의 번호를 생성 언어에 대한 진정으로 임의의거나 버그(을 제공합의 범위 값 등),다음 수행에 필요한 자세한 통계적 분석의 출력이 수백만 반복 합니다. 그릴의 주파수 발생은 각자의 수 및 표시되어야 합니다으로 동일한 확률이다. 는 경우는 결과를 왜곡 방법 중 하나 또는 다른 당신을 보고해야 합니다 당신의 연구 결과를 워크 디자이너가 있습니다. 그들은 확실히 관심 문제를 해결하기 때문에 안전한 임의의 번호 생성기는 근본적인은 암호화 알고리즘이 있습니다.
일반적인 포인터는 나는've 발견 유용한 다룰 때는 코드 무작위로 입력: 체크인 가장자리의 경우 예상되는 임의(최대 및 최소값,최대+1min-1 값은 해당되는 경우). 체크인 장소(에,위,아래)는 숫자가 변곡점(ie-1,0,1,1 보다 크거나,less than1 와 음수가 아닌 경우 소수 값우는 기능). 체크인 몇 가지 장소가 완전히 외부 허용 입력합니다. 체크인 몇 가지 일반적인 경우입니다. 할 수도 있습니다 추가 임의로 입력하지만,에 대한 단위 테스트는 것은 바람직하지 않는 부작용이 같은 값을 아't 에서 테스트를 각각의 시험은행(씨 접근할 수 있도록,처음으로 테스트 1,000 임의의 숫자에서 씨앗이 들거나 같은걸).
테스트를 위한 출력 임의의 기능,그것을 파악하는 것이 중요하다는 목표입니다. 의 경우드,목표의 일관성을 테스트합 0-1 임의의 발전기,을 결정하는 경우 모든 52 카드를 나타난 결과에서,또는 다른 목표를(아마도 모든 이 목록의와 이상)?
에서 특정 예를 들어,당신은 가정의 임의의 번호 생성기는 불투명(단지 그것을 좋아하지 않't 해 단위 테스트 OS syscall 또는 malloc-지 않는 한 당신이 쓰 Os). 그것은 도움이 될 수 있을 측정하는 무작위 숫자는 발전기,그러나 당신의 목적지't 를 작성하는 임의의 생성기 다시 얻을 수 52 카드 각 시간,그리고 그들은 순서 변경.
는's 먼 길을 말하는 정말있는 두 개의 테스트 작업을:여기 테스트에는 레베카는 생산 오른쪽 배포,그리고 확인하는 귀하의 카드가 셔플 코드를 사용하는 RNG 을 생산하는 무작위 결과입니다. 를 작성하는 경우 RNG,사용 통계 분석을 증명하는 당신의 유통 경우,당신은 당'다시 쓰 카드 실업자가 있는지 확인해야 합니다 52non-반복되는 카드를 출력(it's 은 더 나은 사례에 대한 테스트 검사는'다시 사용하여 레베카).
을 테스트하는 소스의 임의의 숫자가 생성하는 무언가에서 적어도의 모양을 가지고 임의 것,내가 테스트를 생성하는 상당히 큰 바이트 시퀀스,쓰기,그들의 임시 파일,그리고 그 밖으로 껍질을Fourmilab's엔도구입니다. 제공 ent-t(간결한)스위치는 것입니다 그래서 생성을 분석하기 쉬운 CSV. 확인 후 다양한 숫자는 그들이"좋습니다."
무엇을 결정하는 번호가 좋은,사용한 잘 알려진 소스의 임의조정하는 시험입니다. 테스트해 거의 항상을 통과할 때 주어진 좋은 설정의 임의의 숫자입니다. 기 때문에라도 진실하게 임의의 시퀀스는 가능성의 순서를 생성하는 나타나다가 아닌 임의의 수 있't 을 테스트하는 특정 전달합니다. 당신은 임계값을 선택하는 가능성은 없는 임의의 시퀀스는 원인이 될 것이 테스트 실패입니다. 아't 임의 재미?
참고:당신은 쓸 수 없는 테스트는 PRNG 생성"random"순서에 있습니다. 할 수 있습 테스트를 작성하는 경우,그 전달음을 나타냅부 확률의 순서에 의해 생성된 PRNG 이"무작위."오신 것을 환영합의 기쁨성!
사례 1:테스트 shuffle:
배열을 고려하십시오[0, 1, 2, 3, 4, 5], 셔플,무엇이 잘못될 수 있는가? 일반적인 물건:a)셔플에서든,b)섞 1-5 지 않 0,셔플 0-4 지만 5,셔플링,그리고 항상 생성하는 동일한 패턴,...
하나의 테스트를 모두 잡으:
셔플 100 시간,값을 추가합에서 각 슬롯이 있습니다. 합계 각의 슬롯해야은 서로 비슷한 슬롯입니다. Avg/표준편차 계산할 수 있다. (5+0)/2=2.5, 100*2.5 = 25. 예상 값은 약 25,예를 들어.
는 경우에는 값의 범위가있는 작은 기회로,당신이 거짓 부정적이다. 을 계산할 수 있습니다,얼마나 큰 기회입니다. 테스트를 반복합니다. 아 물론 작은 기회가있는 테스트를 실패로 2 시간이다. 하지만 당신은 don't 이 일상적인 자동으로 삭제 귀하의 소스 장치-테스트,실패합니까? 다시 실행!
그것은 실패할 수 있습니다 3 배에서 행? 어쩌면 당신은 행운을 시도해야에서 추첨.
사례 2:주사위
주사위 목록에 질문 같은 질문입니다. 주사위를 던져 6000 번입니다.
for (i in 0 to 6000)
++slot [Random.nextInt (6)];
return (slot.max - slot.min) < threshold;