생일 패러독스 또는 PRNG가 생각보다 더 자주 중복을 생성하는 이유.
OP의 문제에는 몇 가지 문제가 있습니다. 하나는 위에서 언급 한 생일 역설 이고 두 번째는 생성하는 항목의 특성으로, 주어진 숫자가 반복되지 않는다는 것을 본질적으로 보장하지는 않습니다.
Birthday Paradox는 주어진 값이 생성기 기간 동안 두 번 이상 발생할 수있는 경우 적용됩니다. 따라서 값 샘플 내에서 중복이 발생할 수 있습니다. 생일 패러독스의 효과는 그러한 복제물을 얻을 수있는 실제 가능성이 상당히 중요하고 그 사이의 평균 기간이 생각보다 짧다는 것입니다. 지각 된 확률과 실제 확률 사이의 이러한 불협화음으로 인해 Birthday Paradox 는 순진한 직관적 추정이 매우 잘못 될 가능성 이있는 인지 편향 의 좋은 예입니다 .
의사 난수 생성기 (PRNG)에 대한 간단한 입문서
문제의 첫 번째 부분은 난수 생성기의 노출 된 값을 훨씬 더 작은 숫자로 변환하여 가능한 값의 공간이 줄어든다는 것입니다. 일부 의사 난수 생성기 는 해당 기간 동안 값을 반복하지 않지만이 변환은 도메인을 훨씬 더 작은 도메인으로 변경합니다. 더 작은 도메인은 '반복 없음'조건을 무효화하므로 상당한 반복 가능성을 기대할 수 있습니다.
예를 들면 같은 일부 알고리즘, 선형 합동 PRNG는 ( A'=AX|M
) 할 전체 기간 동안 보증 고유성을. LCG에서 생성 된 값에는 누산기의 전체 상태가 포함되며 추가 상태는 유지되지 않습니다. 생성기는 결정적이며 기간 내에서 숫자를 반복 할 수 없습니다. 주어진 누산기 값은 가능한 연속 값을 하나만 의미 할 수 있습니다. 따라서 각 값은 생성기 기간 내에 한 번만 발생할 수 있습니다. 그러나 이러한 PRNG의 기간은 상대적으로 작으며 (LCG 알고리즘의 일반적인 구현의 경우 약 2 ^ 30) 고유 값의 수보다 클 수 없습니다.
모든 PRNG 알고리즘이이 특성을 공유하는 것은 아닙니다. 일부는 기간 내에 주어진 값을 반복 할 수 있습니다. OP의 문제에서 Mersenne Twister 알고리즘 (Python의 임의 모듈 에서 사용됨 )은 2 ^ 32보다 훨씬 긴 기간을 갖습니다. Linear Congruential PRNG와 달리 누산기에 추가 상태가 포함되어 있으므로 결과는 순수하게 이전 출력 값의 함수가 아닙니다. 32 비트 정수 출력과 ~ 2 ^ 19937의 기간으로 이러한 보장을 제공 할 수 없습니다.
Mersenne Twister는 우수한 통계적 및 기하학적 특성과 매우 오랜 기간 동안 시뮬레이션 모델에 사용되는 PRNG에 바람직한 특성을 가지고 있기 때문에 PRNG에 널리 사용되는 알고리즘입니다.
좋은 통계적 속성 은 알고리즘에 의해 생성 된 숫자가 다른 숫자보다 나타날 확률이 훨씬 높은 숫자없이 균등하게 분포되어 있음을 의미합니다. 통계적 속성이 좋지 않으면 결과에 원치 않는 왜곡이 발생할 수 있습니다.
좋은 기하학적 특성 은 N 개의 숫자 집합이 N 차원 공간의 초평면에 있지 않음을 의미합니다. 잘못된 기하학적 특성은 시뮬레이션 모델에서 잘못된 상관 관계를 생성하고 결과를 왜곡 할 수 있습니다.
기간이 길다는 것은 시퀀스가 시작될 때까지 많은 숫자를 생성 할 수 있음을 의미합니다. 모델에 많은 반복이 필요하거나 여러 시드에서 실행되어야하는 경우 일반적인 LCG 구현에서 사용할 수있는 2 ^ 30 정도의 이산 숫자로는 충분하지 않을 수 있습니다. MT19337 알고리즘은 2 ^ 19337-1 또는 약 10 ^ 5821이라는 매우 긴 기간을 갖습니다. 이에 비해 우주의 총 원자 수는 약 10 ^ 80 개로 추정됩니다.
MT19337 PRNG에 의해 생성 된 32 비트 정수는 그러한 긴 기간 동안 반복을 피하기 위해 충분한 이산 값을 나타낼 수 없습니다. 이 경우 중복 값이 발생할 가능성이 높으며 샘플이 충분히 크면 불가피합니다.
간단히 말해서 생일 역설
이 문제는 원래 방에있는 두 사람이 같은 생일을 공유 할 확률로 정의됩니다. 요점은 방에 있는 두 사람이 생일을 같이 할 수 있다는 것입니다. 사람들은 방에있는 누군가가 특정 개인과 생일을 공유 할 확률로 문제를 순진하게 오해하는 경향이 있으며, 이는 사람들이 확률을 과소 평가하게 만드는 인지 편향의 원인입니다. 이것은 잘못된 가정입니다. 특정 개인과 일치해야 할 필요가 없으며 두 개인이 일치 할 수 있습니다.
두 개인간에 일치가 발생할 확률은 특정 날짜에 일치 할 필요가 없기 때문에 특정 개인과 일치 할 확률보다 훨씬 높습니다. 오히려 생일이 같은 사람을 두 명만 찾으면됩니다. 이 그래프 (주제에 대한 Wikipedia 페이지에서 찾을 수 있음)에서 우리는 방에 23 명만 있으면 이런 식으로 일치하는 두 사람을 찾을 확률이 50 %임을 알 수 있습니다.
주제에 대한 Wikipedia 항목에서 멋진 요약을 얻을 수 있습니다 . 영업 이익의 문제에서, 우리는 우리의 확률을 알고 싶어 ( '사람'으로 동일시) 생성 임의의 값의 주어진 숫자에 대해 4,500 가능한 '생일'보다는 365이 어떤 순서에서 나타나는 두 개의 동일한 값을.
OP 문제에 대한 Birthday Paradox의 가능한 영향 계산
100 개의 숫자 시퀀스에 대해 잠재적으로 일치 할 수있는
쌍 ( 문제 이해 참조 )이 있습니다 (즉, 첫 번째는 두 번째, 세 번째 등과 일치 할 수 있고 두 번째는 세 번째, 네 번째 등과 일치 할 수 있음). 잠재적으로 일치 할 수있는 조합 의 수는 100 개가 아닙니다.
에서 확률을 계산 우리의 식을 얻을
. 아래의 Python 코드 스 니펫은 일치하는 쌍이 발생할 확률에 대한 순진한 평가를 수행합니다.
from math import log10, factorial
PV=4500
SS=100
numerator = factorial (PV)
denominator = (PV ** SS) * factorial (PV - SS)
log_prob_no_pair = log10 (numerator) - log10 (denominator)
print 1.0 - (10 ** log_prob_no_pair)
이것은 4500 개의 가능한 값의 모집단에서 샘플링 된 100 개의 숫자 내에서 발생하는 일치에 대해 p = 0.669 의 현명한 결과를 생성 합니다. (아마도 누군가가 이것을 확인하고 잘못된 경우 댓글을 게시 할 수 있습니다). 이것으로부터 우리는 OP에 의해 관찰 된 일치하는 숫자 사이의 실행 길이가 상당히 합리적으로 보인다는 것을 알 수 있습니다.
각주 : 셔플 링을 사용하여 고유 한 의사 난수 시퀀스 얻기
보장 된 고유 한 난수 집합을 얻는 방법은 S. Mark 의이 답변을 참조하십시오 . 포스터가 참조하는 기술은 숫자 배열 (사용자가 제공하여 고유하게 만들 수 있음)을 가져 와서 임의의 순서로 섞습니다. 셔플 된 배열에서 순서대로 숫자를 그리면 반복되지 않는 일련의 의사 난수를 얻을 수 있습니다.
각주 : 암호화 보안 PRNG
MT 알고리즘은 일련의 숫자를 관찰하여 생성기의 내부 상태를 추론하기가 상대적으로 쉽기 때문에 암호 학적으로 안전 하지 않습니다 . Blum Blum Shub 와 같은 다른 알고리즘 은 암호화 응용 프로그램에 사용되지만 시뮬레이션 또는 일반 난수 응용 프로그램에는 적합하지 않을 수 있습니다. 암호 학적으로 안전한 PRNG는 비용이 많이 들거나 (아마도 큰 계산이 필요함) 좋은 기하학적 속성이 없을 수 있습니다. 이러한 유형의 알고리즘의 경우 주요 요구 사항은 일련의 값을 관찰하여 생성기의 내부 상태를 추론하는 것이 계산적으로 실행 불가능해야한다는 것입니다.