태그 보관물: random-generation

random-generation

공정한 d6을 사용하여 1에서 설명 할 것 입니다.엔NN 예시적인

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

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

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

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


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



답변

면을 갖는 다이의 독립적 인 롤 에서 식별 가능한 식별 가능한 결과 의 세트 은 요소를 갖는다. 다이는 공정 인 경우에는, 수단은 하나의 롤의 각 결과에 확률 갖는 이러한 결과는 각각 따라서 확률 것이다 독립 수단 이고, 그들이 균일 한 분포를 갖도록Ω ( 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 (1F).

1m(1F).

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

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

N c m = d nN F > 0.

Ncm=dnNF>0.

이것은 (결정 주어진 상황에서 그것이 분명하게 ), 함으로써 가능한 한 작게 만들어진다 최대의 다중 동일 보다 작거나 같음 우리는 이것을 가장 큰 정수 함수 (또는 “floor”) 로 쓸 수 있습니다.c , d , n , m c,d,n,mF Fd nN 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


답변

의 경우 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에게 감사드립니다.


답변

경우 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


답변

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 6330 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 610 6 = 555,550 6 중지;

  • 기타


답변