공정한 6면 주사위 (d6)를 굴려서 1에서 특정 까지 정수를 그리려고 합니다. 좋은 대답은 왜 그 방법이 균일 하고 독립적 인 정수를 생성하는지 설명 할 것 입니다.엔
예시적인 예로서, 의 경우에 어떻게 솔루션이 작동하는지 설명하는 것이 도움이 될 것 입니다.N = 150
또한 가능한 한 효율적으로 절차를 수행하고 싶습니다. 생성 된 각 숫자에 대해 최소 개수의 d6을 평균적으로 굴립니다.
Senary 에서 10 진수로의 변환 은 허용됩니다.
답변
면을 갖는 다이의 독립적 인 롤 에서 식별 가능한 식별 가능한 결과 의 세트 은 요소를 갖는다. 다이는 공정 인 경우에는, 수단은 하나의 롤의 각 결과에 확률 갖는 이러한 결과는 각각 따라서 확률 것이다 독립 수단 이고, 그들이 균일 한 분포를 갖도록Ω ( d , n )
다이 의 결과 , 즉 의 요소를 결정하거나 실패를보고 하는 절차 를 고안했다고 가정 해 봅시다. 결과를 얻으려면 반복하십시오.) 그건,t
t : Ω ( d , n ) → Ω ( c , m ) ∪ { Failure } .
하자 확률 될 것이 실패 결과 비고 어떤 정수배 말하자면F
F = 잠 ( t ( ω ) = 실패 ) = N Fd – n .
(나중에 참조 할 수 있도록 실패하지 않기 전에 를 호출해야하는 예상 횟수 는 )t
요건 이러한 결과 것을 균일하고 독립적 인 조건 에서 실패 수단보고하지 즉 의미에서 보존 확률이 모든 이벤트Ω ( c , m )
P d , n ( t * A )1 − F =Pc,m(A)
어디
t ∗ ( A ) = { ω ∈ Ω ∣ t ( ω ) ∈ A }
프로 시저 가 이벤트 할당 하는 다이 롤 세트입니다t
원자력 이벤트 . 확률은 이어야합니다 ( 와 관련된 주사위 롤 )에 요소 가 있다고 합시다 . 이됩니다A = { η } ⊂ Ω ( c , m )
N η d – n1 − N F d − n = P d , n ( t * A )1 − F =Pc,m(A)=c−m.
가 모두 정수 과 같다는 것은 즉각이다N은 η
1m (1–F).
두 가지 즉각적이고 명백한 의미가 있습니다. 하나는 이 커질 때 작게 유지할 수 있다면 실패보고의 효과는 무의미 하다는 것 입니다. 다른 하나는 주어진 ( 시뮬레이션을 위해 다이 의 롤 수 )에 대해 를 가능한 작게 만들고 싶습니다 .F의
분모를 지우고 를 자세히 살펴 보겠습니다 .( 2 )
N c m = d n – N F > 0.
이것은 (결정 주어진 상황에서 그것이 분명하게 ), 함으로써 가능한 한 작게 만들어진다 최대의 다중 동일 보다 작거나 같음 우리는 이것을 가장 큰 정수 함수 (또는 “floor”) 로 쓸 수 있습니다.c , d , n , m
N = ⌊ d nc m ⌋.
마지막으로 은 중복성 을 측정하기 때문에 효율성을 높이기 위해 가능한 한 작아야 한다는 것이 분명합니다 . 구체적으로, 다이 의 하나의 롤을 생성하는데 필요한 다이 의 예상 롤 수 는N
N × nm ×11 – F .
따라서 고효율 절차에 대한 우리의 탐색은 이 일부 전력 과 거의 같거나 거의 크지 않은 경우에 중점을 두어야합니다d n
주어진 와 대해,이 접근법이 완벽한 효율에 근접한 배수 의 시퀀스가 있음을 보여 주면서 분석이 끝납니다 . 이는 이 한계에서 에 접근 하는 을 찾는 것입니다 자동으로 보장 ). 이러한 하나의 시퀀스 취함으로써 얻어진다 및 판단d
m = ⌊ n 로그 d로그 c ⌋.
증거는 간단합니다.
이것은 우리가 원래 롤하고자 때 꼭 시간의 충분히 큰 수를 다이 양면 우리 시뮬레이션 기대할 수를 거의 의 결과 (A)의 롤 당 다이 양면 . 마찬가지로d
다수의 시뮬레이션 할 수 (A)의 독립적 인 롤 적정에 사용한 다이 양면 평균하여 다이 양면 결과 당 롤 선택하여 임의로 작게 할 수 충분히 커야한다.m
m cc dd log ( c ) / log ( d ) + ϵ = log d ( c ) + ϵlog(c)/log(d)+ϵ=logd(c)+ϵ ϵϵ mm
예제와 알고리즘
질문에서 이고 .d = 6
로그 d ( c ) = 로그 ( c )로그 ( d ) ≈2.796489.
따라서 가능한 최상의 절차는 각 결과 를 시뮬레이트하기 위해 평균 롤 이상이 필요합니다 .2.796489d6
d150
분석은이를 수행하는 방법을 보여줍니다. 우리는 그것을 수행하기 위해 숫자 이론에 의지 할 필요가 없습니다 : 우리는 단지 과 의 거듭 제곱을 도표화 하고 비교하여 은 가깝습니다. 이 무차별 힘 계산은 쌍을 제공합니다d n = 6 n
( n , m ) ∈ { ( 3 , 1 ) , ( 14 , 5 ) , … }
예를 들어 숫자에 해당
( 6 n , 150 m ) ∈ { ( 216 , 150 ) , ( 78364164096 , 75937500000 ) , … } .
첫 번째 경우에서 는 a의 3 개의 롤 결과의 을 실패에 연관 시키고 다른 결과는 각각 a의 단일 결과와 연관 될 것이다 . t d6
150d150
두 번째 경우에서 는 14 롤의 결과 중 을 실패 에 연결하고 ( 약 3.1 %)-5 개의 결과 시퀀스를 출력합니다 .t d6
d150
구현하는 간단한 알고리즘t
훨씬 더 긴 시퀀스 의 경우 의 연속 분수 확장의 다른 모든 수렴 을 고려하여 적합한 쌍 을 찾을 수 있습니다 연속 분수 이론은 이러한 수렴이 보다 작고 클 때 사이에서 번갈아 나타난다는 것을 보여줍니다 ( 가 이미 합리적이지 않다고 가정 ). 보다 작은 것을 선택하십시오( n , m )
문제에서 처음 몇 가지 수렴은
3,14/5,165/59,797/285,4301/1538,89043/31841,279235/99852,29036139/10383070….
마지막 경우, 29,036,139 롤의 a d6
시퀀스는d150
미만의 실패율을 가진 10,383,070 롤의 시퀀스를 생성하여 2.79649 의 효율로 점근 적 한계에서 없습니다.2×10−8,
답변
의 경우 d6을 세 번 굴리면 결과가 뚜렷하게 나타납니다 .N=150
원하는 결과를 다음과 같이 표로 만들 수 있습니다.
- d6을 순차적으로 세 번 기록하십시오. 결과 생성됩니다 . 의 모든 값 이 동일 할 가능성이 있기 때문에 결과는 균일 합니다 (주사위는 공정하고 각 롤은 별개로 취급됩니다).a,b,c
a,b,c a,b,ca,b,c - 각각에서 1을 빼십시오.
- 이것은 숫자입니다. 각 자릿수 (자리수 값)는 6의 거듭 제곱으로 0에서 5까지가되므로 사용하여 10 진수로 숫자를 쓸 수 있습니다(a−1)×62+(b−1)×61+(c−1)×60
(a−1)×62+(b−1)×61+(c−1)×60 - 1을 더하십시오.
- 결과가 150을 초과하면 결과를 버리고 다시 굴립니다.
결과를 유지할 확률은 입니다. 모든 롤은 독립적이며 “성공”(결과 ) 까지 절차를 반복 하므로 1과 150 사이에서 1 개의 드로우를 생성 하려는 시도 횟수 가 기하 임의 변수로 분포됩니다. 기대 갖는다 . 따라서이 방법을 사용하여 1 드로우를 생성하려면 평균 주사위 롤이 필요합니다 (각 시도 롤이 3 주사위이기 때문에).p=150216=2536
채팅에서이를 제안 해 주신 @whuber에게 감사드립니다.
답변
경우 Sycorax 의 답변에 대한 더 간단한 대안은 다음과 같습니다 . 이므로 다음 절차를 수행 할 수 있습니다.N=150
1에서 150 사이의 균일 한 난수 생성 :
- 3 개의 1D6 롤을 .R1,R2,R3
R1,R2,R3 - 처음 두 롤 중 하나가 6 인 경우 6이 아닐 때까지 다시 굴립니다.
- 숫자 는 기수가 5-5-6 인 위치 표기법을 사용하는 균일 한 숫자입니다. 따라서 원하는 숫자를
(R1,R2,R3)(R1,R2,R3) X=30⋅(R1−1)+6⋅(R2−1)+(R3−1)+1.X=30⋅(R1−1)+6⋅(R2−1)+(R3−1)+1.
이 방법은 더 큰 으로 일반화 할 수 있지만 값에 보다 큰 소수가 하나 이상 있으면 조금 더 어색해집니다 .N
답변
6면 주사위를 사용하여 150 개의
- 후 0
0 롤, 당신은 할 일1 을 구분하는 것만으로는 충분하지 가능성, (150 개)150 값을 - 1
1 롤 후 6 개의6 가능성이 있으며 150 개의150 값 을 구별하기에는 충분하지 않습니다. - 두
2 번의 롤 후 36 개의 가능성이 있으며 150 개의 값 을 구분하기에는 충분하지 않습니다. - 3 개의 롤 후 216 개의 가능성 이 있습니다. 150 개의 값 을 구별하기에는 충분 하지만 66 개의 값이 남아 있습니다. 당신이 지금 멈출 확률은 150입니다216
- 중지하지 않은 경우 4 롤 이후 에는 396 개의 잔존 가능성이 있으며 150 개의 값을 두 가지 방법으로 구분할 수 있지만 96 개의 남은 값 으로 구분할 수 있습니다. 당신이 지금 멈출 확률은 300입니다1296
- 중지하지 않은 경우 5 롤 후 576 개의 잔존 가능성이 있으며 150 개의 값을 세 가지 방법으로 구분할 수 있지만 96 개의 잔존 값 으로 구분할 수 있습니다. 당신이 지금 멈출 확률은 450입니다7776
- 중지하지 않은 경우 6 롤 후에는 756 개의 가능성 이 생겨 150 개의 값을 5 가지 방법으로 구분할 수 있지만 나머지 6 개의 값 으로 구분할 수 있습니다. 당신이 지금 멈출 확률은 750입니다46656
6 롤 후 6 개의 나머지 값 중 하나에 있으면 1 롤 후의 위치와 유사한 상황에 있습니다. 따라서 같은 방식으로 계속할 수 있습니다. 7 롤 후 멈출 확률 은 0입니다.8롤후150, 2799361679616 등
이것들을 합하면 필요한 롤 수는 약 3.39614 입니다. 동일한 확률로 150 을 각각 선택할 수있는 경우에만 값을 선택 하므로 150 에서 균일 한 선택을 제공합니다.
Sycorax는보다 명확한 알고리즘에 대한 의견을 물었습니다.
- 첫째,베이스 -에서 작동 6 과 150 10 = 410 6
- 둘째, 목표 값 1 6 ~ 410 6 대신 목표 값이 0 6 ~ 409 6 이되도록 1을 뺍니다.
- 셋째, 각 다이는 0 6 ~ 5 6의 값을 가져야 하며, 다이를 굴리는 것은 기존 생성 숫자의 오른쪽에 기본 6 자리 숫자를 추가하는 것과 관련이 있습니다. 생성 된 숫자는 선행 0을 가질 수 있으며 자릿수는 지금까지 롤 수입니다.
이 알고리즘은 주사위의 연속 롤입니다.
-
처음 3 개의 주사위를 굴려 000 6 에서 555 6 사이의 숫자를 생성합니다 . 1000 6 ÷ 410 6 = 1 6 나머지 150 6 이기 때문에 생성 된 값이 1000 6 − 150 6 = 410 6 미만이면 생성 된 값 ( 410 6 으로 나눈 나머지 값)을 가져와 정지합니다.
-
계속하면 4 번째 주사위를 굴려 4100 6 에서 5555 6 까지의 숫자를 생성하십시오 . 10000 6 ÷ 410 6 = 12 6 나머지 240 6 이기 때문에 생성 된 값이 10000 6 − 240 6 = 5320 6 미만이면 410 6 으로 나눈 나머지 생성 된 값을 가져 와서 중지합니다.
-
계속하면 다섯 번째 주사위를 굴려 53200 6 에서 55555 6 까지의 숫자를 생성하십시오 . 이후 100000 6 ÷ 410 (6) = 123 6 나머지 330 (6) 는 분할에 의해 생성 된 값의 나머지를 수행 (410) (6) 상기 생성 된 값을 엄격 이하이면 100000 6 – 330 6 = 55,230 6 중지;
-
계속하면 6 번째 주사위를 굴려 552300 6 에서 555555 6 까지의 숫자를 생성 하십시오 . 이후 1,000,000 6 ÷ 410 (6) = 1,235 6 나머지 10 (6) 는 분할에 의해 생성 된 값의 나머지를 수행 (410) (6) 상기 생성 된 값을 엄격 미만인 경우 1,000,000 6 – 10 6 = 555,550 6 중지;
-
기타