문제

구체적인 예

0에서 2 사이의 난수를 생성해야 합니다.(또는 -1, 0, 1 중에서 무작위로 선택)

순진한 접근 방식은 다음과 같은 작업을 수행하는 것입니다. rand() mod 3 어디 rand() 정수를 반환합니다.이 접근 방식은 상한이 아닌 한 통계적으로 난수를 생성하지 않습니다. rand() 상대적으로 소수가 아닙니다(하한은 0입니다).

예를 들어, rand()가 2비트(0부터 3까지)를 반환했다고 가정하면 모듈러스는 다음과 같이 매핑됩니다.

0 -> 0
1 -> 1
2 -> 2
3 -> 0

더 많은 비트가 반환되면 0을 향한 이러한 편향은 확실히 훨씬 줄어들지만, 그럼에도 불구하고 편향은 그대로 유지됩니다.

일반적인 질문

0과 n-1 사이에 균등하게 분포된 난수를 생성하는 방법이 있습니까? 여기서 n은 2에 상대적으로 소수입니다.

도움이 되었습니까?

해결책

일반적인 접근법은 마지막 전체 사이클 위의 임의 값을 폐기하고 새로운 임의의 숫자를 요청하는 것입니다.

다른 팁

rand() 상한을 k*n으로 선택하는 데 도움이 될 수 있습니다. 여기서 k는 정수입니다.이렇게 하면 rand()가 우수한 무작위 생성기라면 ​​결과가 균등하게 분배됩니다.

상한을 줄일 수 없는 경우 k*n이 rand() 상한에 최대한 가깝도록 k를 선택하고 다시 시도하면 이 숫자 위의 결과를 삭제할 수 있습니다.

보다 내 대답 비슷한 질문에.

기본적으로 RNG를 사용하고 N 위의 모든 것을 버리고 다시 시도하십시오. 최적화를 위해 Mod를 사용하고 N * Floor (Max / N) 위의 모든 것을 버릴 수 있습니다.

일반적인 답변 : 숫자의 2 비트 이상을 사용해야합니다.

내 규칙은 부동 소수점 값을 생성하는 것입니다. 엑스, 0.0 <= 엑스 <1.0, 3을 곱하고 잘립니다. 더 많은 수의 비트에 의존하는 범위 0, 1 및 2의 값을 얻을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top