공정한 d6을 사용하여 1에서


18

공정한 6면 주사위 (d6)를 굴려서 1에서 특정 까지 정수를 그리려고 합니다. 좋은 대답은 왜 그 방법이 균일 하고 독립적 인 정수를 생성하는지 설명 할 것 입니다.N

예시적인 예로서, 의 경우에 어떻게 솔루션이 작동하는지 설명하는 것이 도움이 될 것 입니다.N = 150N=150

또한 가능한 한 효율적으로 절차를 수행하고 싶습니다. 생성 된 각 숫자에 대해 최소 개수의 d6을 평균적으로 굴립니다.

Senary 에서 10 진수로의 변환 은 허용됩니다.


이 질문은이 메타 스레드에서 영감을 얻었습니다 .

답변:


12

면을 갖는 다이의 독립적 인 롤 에서 식별 가능한 식별 가능한 결과 의 세트 은 요소를 갖는다. 다이는 공정 인 경우에는, 수단은 하나의 롤의 각 결과에 확률 갖는 이러한 결과는 각각 따라서 확률 것이다 독립 수단 이고, 그들이 균일 한 분포를 갖도록Ω ( d , n ) Ω(d,n)n nd = 6 d=6d ndn 1 / d 1/d( 1 / d ) n : (1/d)n:P d , n .Pd,n.

다이 의 결과 , 즉 의 요소를 결정하거나 실패를보고 하는 절차 를 고안했다고 가정 해 봅시다. 결과를 얻으려면 반복하십시오.) 그건,t tm mc ( = 150 ) c(=150)Ω ( c , m )Ω(c,m)

t : Ω ( d , n ) Ω ( c , m ) { Failure } .

t:Ω(d,n)Ω(c,m){Failure}.

하자 확률 될 것이 실패 결과 비고 어떤 정수배 말하자면F Ft tF Fd n ,dn,

F = ( t ( ω ) = 실패 ) = N Fd - n .

F=Pr(t(ω)=Failure)=NFdn.

(나중에 참조 할 수 있도록 실패하지 않기 전에 를 호출해야하는 예상 횟수 는 )t t1 / ( 1 - F ) .1/(1F).

요건 이러한 결과 것을 균일하고 독립적 인 조건 에서 실패 수단보고하지 즉 의미에서 보존 확률이 모든 이벤트Ω ( c , m ) Ω(c,m)t t AΩ ( c , m ) ,ttAΩ(c,m),

P d , n ( t * A )1 F =Pc,m(A)

Pd,n(tA)1F=Pc,m(A)(1)

어디

t ( A ) = { ω Ω t ( ω ) A }

t(A)={ωΩt(ω)A}

프로 시저 가 이벤트 할당 하는 다이 롤 세트입니다t t.A.

원자력 이벤트 . 확률은 이어야합니다 ( 와 관련된 주사위 롤 )에 요소 가 있다고 합시다 . 이됩니다A = { η } Ω ( c , m ) A={η}Ω(c,m)c - m . cm.t ( A )t(A) η ηN ηNη ( 1 )(1)

N η d - n1 N F d n = P d , n ( t * A )1 F =Pc,m(A)=cm.

Nηdn1NFdn=Pd,n(tA)1F=Pc,m(A)=cm.(2)

가 모두 정수 과 같다는 것은 즉각이다N은 ηNη N을 . N. 가장 효율적인 절차를 찾아야한다 비 장애의 예상 수 의 롤 당 다이 양면 IS를t. t.c

1m (1-F).

1m(1F).

두 가지 즉각적이고 명백한 의미가 있습니다. 하나는 이 커질 때 작게 유지할 수 있다면 실패보고의 효과는 무의미 하다는 것 입니다. 다른 하나는 주어진 ( 시뮬레이션을 위해 다이 의 롤 수 )에 대해 를 가능한 작게 만들고 싶습니다 .F의 Fm을 mm mC cFF

분모를 지우고 를 자세히 살펴 보겠습니다 .( 2 )(2)

N c m = d n - N F > 0.

Ncm=dnNF>0.

이것은 (결정 주어진 상황에서 그것이 분명하게 ), 함으로써 가능한 한 작게 만들어진다 최대의 다중 동일 보다 작거나 같음 우리는 이것을 가장 큰 정수 함수 (또는 "floor") 로 쓸 수 있습니다.c , d , n , m c,d,n,mF Fd n - N F dnNFc m cmd n . dn.

N = d nc m.

N=dncm.

마지막으로 은 중복성 을 측정하기 때문에 효율성을 높이기 위해 가능한 한 작아야 한다는 것이 분명합니다 . 구체적으로, 다이 의 하나의 롤을 생성하는데 필요한 다이 의 예상 롤 수 는N Nt d ctdc

N × nm ×11 - F .

N×nm×11F.

따라서 고효율 절차에 대한 우리의 탐색은 이 일부 전력 과 거의 같거나 거의 크지 않은 경우에 중점을 두어야합니다d n dnc m .cm.

주어진 와 대해,이 접근법이 완벽한 효율에 근접한 배수 의 시퀀스가 있음을 보여 주면서 분석이 끝납니다 . 이는 이 한계에서 에 접근 하는 을 찾는 것입니다 자동으로 보장 ). 이러한 하나의 시퀀스 취함으로써 얻어진다 및 판단d dc , c,( n , m ) (n,m)( n , m ) (n,m)d n / c m1 dn/cm1N = 1 N=1F 0 F0n = 1 , 2 , 3 , n=1,2,3,

m = n 로그 d로그 c.

m=nlogdlogc.(3)

증거는 간단합니다.

이것은 우리가 원래 롤하고자 때 꼭 시간의 충분히 큰 수를 다이 양면 우리 시뮬레이션 기대할 수를 거의 의 결과 (A)의 롤 당 다이 양면 . 마찬가지로d dn , n,log d / log c = 로그 c d logd/logc=logcdcc

다수의 시뮬레이션 할 수 (A)의 독립적 인 롤 적정에 사용한 다이 양면 평균하여 다이 양면 결과 당 롤 선택하여 임의로 작게 할 수 충분히 커야한다.m mc cd dlog ( c ) / log ( d ) + ϵ = log d ( c ) + ϵ log(c)/log(d)+ϵ=logd(c)+ϵϵ ϵmm


예제와 알고리즘

질문에서 이고 .d = 6 d=6c = 150 ,c=150,

로그 d ( c ) = 로그 ( c )로그 ( d )2.796489.

logd(c)=log(c)log(d)2.796489.

따라서 가능한 최상의 절차는 각 결과 를 시뮬레이트하기 위해 평균 롤 이상이 필요합니다 .2.7964892.796489d6d150

분석은이를 수행하는 방법을 보여줍니다. 우리는 그것을 수행하기 위해 숫자 이론에 의지 할 필요가 없습니다 : 우리는 단지 과 의 거듭 제곱을 도표화 하고 비교하여 은 가깝습니다. 이 무차별 힘 계산은 쌍을 제공합니다d n = 6 n dn=6nc m = 150 m cm=150mc md ncmdn ( n , m )(n,m)

( n , m ) { ( 3 , 1 ) , ( 14 , 5 ) , }

(n,m){(3,1),(14,5),}

예를 들어 숫자에 해당

( 6 n , 150 m ) { ( 216 , 150 ) , ( 78364164096 , 75937500000 ) , } .

(6n,150m){(216,150),(78364164096,75937500000),}.

첫 번째 경우에서 는 a의 3 개의 롤 결과의 을 실패에 연관 시키고 다른 결과는 각각 a의 단일 결과와 연관 될 것이다 . t t216 - 150 = 66 216150=66d6150150d150

두 번째 경우에서 는 14 롤의 결과 중 을 실패 에 연결하고 ( 약 3.1 %)-5 개의 결과 시퀀스를 출력합니다 .t t78364164096 759375000007836416409675937500000d6d150

구현하는 간단한 알고리즘tt d 0 , 1 , , d - 1 c 0 , 1 , , c - 1. n n d . c . m m t 의 라벨면 도면 부호 다이 양면 과의 얼굴 도면 부호 다이 양면첫 번째 다이 의 롤은 베이스 에서 자리 숫자 로 해석됩니다 이것은 밑 의 숫자로 변환됩니다 최대 자릿수 가 있으면 마지막 자릿수 의 순서 가 출력됩니다. 그렇지 않으면, 는 재귀 적으로 호출하여 Failure를 리턴합니다.d0,1,,d1c0,1,,c1.nnd.c.mmt

훨씬 더 긴 시퀀스 의 경우 의 연속 분수 확장의 다른 모든 수렴 을 고려하여 적합한 쌍찾을 수 있습니다 연속 분수 이론은 이러한 수렴이 보다 작고 클 때 사이에서 번갈아 나타난다는 것을 보여줍니다 ( 가 이미 합리적이지 않다고 가정 ). 보다 작은 것을 선택하십시오( n , m ) (n,m)n / m n/mx = log ( c ) / log ( d ) . x=log(c)/log(d).x xx xx .x.

문제에서 처음 몇 가지 수렴은

3,14/5,165/59,797/285,4301/1538,89043/31841,279235/99852,29036139/10383070.

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×108,2×108,2.796492.79649


2
언제나 그렇듯이,이 답변은 질문을하기 전에도 형식화되고 준비된 것처럼 보입니다!
Łukasz Grad

1
감사합니다, @ ŁukaszGrad. 그러나 나는 그러한 기계 가공에 대해 결백하며 날카로운 눈을 가진 독자는 내가 이것을 써서 서둘렀다는 서두의 증거를 찾을 것이라고 확신합니다.
whuber

가 소수가 아닐 때 , 샘플 공간 이 동일한 확률의 부분 집합으로 분할 될 수 있다는 것도 고려해야 합니까? 예를 들어, d6을 d2 또는 d3으로 사용할 수 있으며 216 개보다 150에 가까운 162 개의 요소가있는 샘플 공간은 4 개의 롤 (1d6 + 3d3)로 얻을 수 있습니다. (3d6 솔루션과 동일한 예상 롤 수를 제공하지만 분산은 더 낮습니다.)ddΩ(d,1)Ω(d,1)
Scortchi-복원 모니카

@Scortchi 당신은 균일 한 분포에서 추첨을 시뮬레이션하기 위해 주사위를 선택할 수있는 약간 다른 설정을 설명합니다. 비슷한 분석이 적용됩니다. 수행하는 것이 재미있을 수 있습니다.
whuber

7

의 경우 d6을 세 번 굴리면 결과가 뚜렷하게 나타납니다 .N=150N=15063=21663=216

원하는 결과를 다음과 같이 표로 만들 수 있습니다.

  • d6을 순차적으로 세 번 기록하십시오. 결과 생성됩니다 . 의 모든 값 이 동일 할 가능성이 있기 때문에 결과는 균일 합니다 (주사위는 공정하고 각 롤은 별개로 취급됩니다).a,b,ca,b,ca,b,ca,b,c
  • 각각에서 1을 빼십시오.
  • 이것은 숫자입니다. 각 자릿수 (자리수 값)는 6의 거듭 제곱으로 0에서 5까지가되므로 사용하여 10 진수로 숫자를 쓸 수 있습니다(a1)×62+(b1)×61+(c1)×60
    (a1)×62+(b1)×61+(c1)×60
  • 1을 더하십시오.
  • 결과가 150을 초과하면 결과를 버리고 다시 굴립니다.

결과를 유지할 확률은 입니다. 모든 롤은 독립적이며 "성공"(결과 ) 까지 절차를 반복 하므로 1과 150 사이에서 1 개의 드로우를 생성 하려는 시도 횟수 가 기하 임의 변수로 분포됩니다. 기대 갖는다 . 따라서이 방법을 사용하여 1 드로우를 생성하려면 평균 주사위 롤이 필요합니다 (각 시도 롤이 3 주사위이기 때문에).p=150216=2536p=150216=25361,2,,1501,2,,150p1=3625p1=36253625×3=4.323625×3=4.32


채팅에서이를 제안 해 주신 @whuber에게 감사드립니다.


나는 Henry의 방법이 균일 한 분포를 생성하지 않는다고 생각합니다. 재활용으로 인해 일부 숫자가 선호되기 때문입니다. 재활용이 어떻게 수행되어야하는지 완전히 이해하지 못하기 때문에 확실하지 않습니다.
whuber

1
@whuber 아! 귀하의 우려를 이해합니다. 방금 자신에게 프로세스를 설명하려고했는데 직관에 결함이있는 이유를 깨달았습니다. 추가 다이를 굴릴 확률이 확률을 10 진수로 지정하고 불균일하게 만드는 방법을 미리 알지 못합니다. 우리는 많은 주사위를 굴립니다.
Sycorax는 Reinstate Monica가

4

경우 Sycorax 의 답변에 대한 더 간단한 대안은 다음과 같습니다 . 이므로 다음 절차를 수행 할 수 있습니다.N=150N=150150=5×5×6150=5×5×6

1에서 150 사이의 균일 한 난수 생성 :

  • 3 개의 1D6 롤을 .R1,R2,R3R1,R2,R3
  • 처음 두 롤 중 하나가 6 인 경우 6이 아닐 때까지 다시 굴립니다.
  • 숫자 는 기수가 5-5-6 인 위치 표기법을 사용하는 균일 한 숫자입니다. 따라서 원하는 숫자를 (R1,R2,R3)(R1,R2,R3)X=30(R11)+6(R21)+(R31)+1.
    X=30(R11)+6(R21)+(R31)+1.

이 방법은 더 큰 으로 일반화 할 수 있지만 값에 보다 큰 소수가 하나 이상 있으면 조금 더 어색해집니다 .NN66


1
예상되는 롤당 롤 수로이 방법의 효율성을 설명하고 결과가 1,2, ...., 150에서 균일 한 이유를 명확하게 설명 할 수 있습니까?
Sycorax는 Reinstate Monica가

재 롤링이 필요없는 결과를 얻을 확률은 이며 이는 귀하의 답변과 동일합니다. 그것이 왜 균일한지를 이해하려면 기수 5-5-6의 위치 표기법을 사용하여 효과적으로 균일 한 숫자를 생성하는 것입니다. 즉, 마지막 숫자는 단위이고 두 번째 마지막 숫자는 "6"이고 세 번째 숫자는 -마지막 숫자는 "30 년대"입니다. 25/3625/36
Monica Reinstate Monica

1
이 방법은 실제로 답변의 방법에 약간의 변형이 있습니다. 귀하의 답변에서 6-6-6 숫자 척도로 균일 한 숫자를 만든 다음 유효하지 않은 값 버리고 내 대답 에서는 5-5-6 척도에서 숫자를 생성하기 위해 먼저 유효하지 않은 값을 버립니다 .
Monica Reinstate Monica

3
+1 실제적으로 이것은 매력적인 알고리즘입니다. 다이 롤에 의해 구동되는 유한 상태 오토 마톤을 구현한다는 것은 흥미롭고 아마도 더 광범위한 분석을 암시합니다. {Start, A, B, Accept}의 네 가지 상태가 있습니다. 롤링시 A 로의 전환 시작 1..5; 롤링시 B로 전이 1..5; 그리고 B는 무언가를 굴릴 때 수락으로 전환합니다. 각 전이는 롤의 원인이 된 롤의 값을 저장하므로 세 개의 저장된 롤 시퀀스를 출력하고 자동으로 다시 시작으로 전환합니다.
whuber

4
@Sycorax만큼 자주 거부하지만 평균적으로 롤 수를 줄입니다. 예상되는 번호 변수 당 롤은 입니다. 65+65+1=3.465+65+1=3.4
Scortchi-Monica Monica 복원

2

6면 주사위를 사용하여 150 개의150 값 중에서 균일하게 선택하는 알고리즘을 설명하기 위해 각 롤을 사용하여 사용 가능한 값에 66 을 곱하고 각각의 새로운 값을 동일하게 만들 수 있습니다.

  • 00 롤, 당신은 할 1 을 구분하는 것만으로는 충분하지 가능성, (150 개)150 값을
  • 11 롤 후 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는보다 명확한 알고리즘에 대한 의견을 물었습니다.

  • 첫째,베이스 -에서 작동 6150 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 6150 6 = 410 6 미만이면 생성 된 값 ( 410 6 으로 나눈 나머지 값)을 가져와 정지합니다.

  • 계속하면 4 번째 주사위를 굴려 4100 6 에서 5555 6 까지의 숫자를 생성하십시오 . 10000 6 ÷ 410 6 = 12 6  나머지  240 6 이기 때문에 생성 된 값이 10000 6240 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 중지;

  • 기타


(+1) 4d6 또는 5d6의 결과를 1,2, ..., 150으로 매핑하는 방법을 설명하면이 대답이 더 명확 해집니다.
Sycorax는 Reinstate Monica가

@Sycorax-나는 이제 기본 6 매핑을 제공했습니다
Henry

1
엔트로피 고려 사항은이 알고리즘보다 훨씬 더 잘 수행 할 수 있음을 나타냅니다. 또한 알고리즘이 실제로 균일 한 분포로 독립적으로 분포 된 값을 생성 함을 보여줍니다 .
whuber

@ whuber-내 알고리즘은 150 가지 가능성 에서 정확히 하나의 정수를 생성 하므로 주사위 롤이 균일하고 독립적으로 제공됩니다. 각 단계에서 도달하면 각 150 개의 값이 동일하게 선택 될 수 있습니다. 그것은 당신의 대답과 달리 여러 값을 생산하지 않습니다
Henry

1
"알고리즘은 연속적인 주사위 굴림"이라는 글에서 당신이 의미하는 바를 오해했습니다. (더 자세히 읽어야합니다.) 그렇게하면 알고리즘이 균일 한 분포를 생성하지 않는 것 같지만 일반적인 알고리즘의 의도를 알 수 없었기 때문에 확실하지 않습니다. 있다. 균일 한 값을 생성한다는 데모를 보는 것이 좋습니다.
whuber
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.