공정한 동전이 주어진 주사위를 시뮬레이션하는 방법


21

공정한 동전이 주어지고 공정한 (6면) 주사위를 반복적으로 뒤집을 확률 분포를 시뮬레이션한다고 가정합니다. 내 초기 아이디어는 우리가 적절한 정수 선택해야한다는 것입니다 , 등이 2 K = (6) m를 . 코인을 k 번 뒤집은 후 , 우리는 k 길이 비트 열에 의해 인코딩 된 숫자를 [ 0 , 2 k - 1 ] 범위 를 길이 m 각각의 6 간격 으로 나누어 다이의 출력에 매핑합니다 . 그러나 2 k 가 2의 유일한 주요 요인이지만 2의 주요 요인 이기 때문에 이것은 불가능합니다.k,m2k=6mk[0,2k1]m2k 세 가지를 포함한다. 이 작업을 수행하는 다른 간단한 방법이 있어야합니다.6m


보다 일반적인 방식으로 문제를 다루는 이 질문을 참조하십시오 .
Raphael

여기 주제에 관한 기사가 있습니다. 거부 샘플링을 사용하는 방법과 "폐기 된"비트를 재사용하여 추가 롤 속도를 높이는 방법에 대해 설명합니다.
ZeroUltimax

답변:


12

@FrankW가 지적한 방법보다 약간 더 효율적인 방법을 사용하지만 동일한 아이디어를 사용하려면 동전을 번 뒤집어 2 n 미만의 숫자를 얻을 수 있습니다 . 이어서 일괄로 이것을 해석 m 다이가 플립, m은 매우 많은 수하다 6 m < 2 N (이미 말했듯 평등 여기 보유하지 않음). 당신이 숫자 이상을 얻거나 동일한 경우 (6) m 당신은 값을 거부하고 모든 반복해야합니다 n이 뒤집습니다.n2nmm6m<2n6mn

코인 플립을 만들어 단일 다이 플립을 반환하는 함수를 구현 한 후 다음 m - 1 다이 플립 요청에 대한 결과를 캐시 할 수 있습니다 .nm1

흥미로운 점은 일부 값은 거부율이 낮기 때문에 다른 값 보다 낫다는 것입니다. 다음은 좋은 값의 목록입니다 (예 : 이전 값보다 거부율이 낮은 값).

n m r
3 1 0.25
8 3 0.15625
13 5 0.05078125
44 17 0.0378308072686
75 29 0.0247036782182
106 41 0.0113974522704
243 94 0.00933096248381
380 147 0.00726015308463
517 200 0.00518501504347
654 253 0.00310553931213
791 306 0.00102171682348

다음 공식으로 구합니다 : .

m=nlog32r=13m2n

첫 번째 행은 거부율이 25 % 인 @FrankW의 답변에 해당합니다. 다음과 같은 숫자가 좋습니다 : n = 13 은 모두 단일 정수 정적 변수로 유지 될 수 있습니다. 특히, n = 13 의 거부율은 5 %에 불과하며 이는 25 %에 비해 상당한 개선이며 이는 가능한 구현을위한 좋은 후보가된다.n=8n=13n=13


6 ^ m이 필요하지 않고 6 * m이면 충분합니다. 따라서 5 던지기를 사용하면 1/16 건만 거부하는 5 비트 숫자를 얻을 수 있습니다.
Taemyr

3 회 던지기의 25 %와 비교할 때 13 회 던지기의 5 % 거부율은 끔찍합니다. 3 회 던지기의 25 %가 0.390625 %에서 4 회만 거부 (즉, 12 회 이상 던지기)하기 때문입니다.
Taemyr

@Taemyr 5 비트 숫자는 32 개의 서로 다른 값을 나타내므로 단일 주사위를 나타낼 수 있습니다 (두 개의 주사위에는 36 개의 가능성이 있기 때문에). A는 27/32 = 84 %의 비율로 거부 따라서 단지 6/32의 값은 허용
에마 Paolini는

@Taemyr : A는 거절 율 해당 평균마다 일괄 수단 토스 N 토스가 거절 확률로 도착 R을 . 따라서 평균적으로 각 던지기는 동일한 비율 r로 거부됩니다 ( n 에 의존하지 않음 ). rnnrrn
Emanuele Paolini

예. 그리고 3 번의 회분에 대해 회귀 율이 25 % 인 FrankW의 방법을 사용하면 1 번에서 0.00390625의 확률로 네 번째 회분을 수락 할 수 있습니다.
Taemyr

29

당신이 할 수있는 일은 거절 샘플링 이라는 방법을 사용하는 것입니다 .

  • 동전을 3 번 뒤집고 각 뒤집기를 비트 (0 또는 1)로 해석하십시오.
  • 3 비트를 연결하여 에 이진수를 제공합니다 .[0,7]
  • 숫자가 에 있으면 다이 롤로 가져갑니다.[1,6]
  • 그렇지 않으면, 즉 결과가 또는 7 인 경우 플립을 반복하십시오.07

6 이후 가능한 결과의 이상이 필요의 각 세트의 종단에 확률을 이끌어다이 롤을 얻기 플립 세트 것은(1-668l . 따라서이 방법은 실제로 효율적입니다.(168)l=14l

개량:

@Angel의 대답 에 따르면 각 세트의 동전 수는 뒤집어 지지만 다음 세트의 첫 번째 비트로 7 의 차이를 사용하여 첫 번째 동전을 3에서 2로 줄일 수 있다고 지적합니다 .07

@Emanuele Paolini 는 다이 롤이 여러 개인 경우 재롤 수를 줄이는 방법을 설명합니다.


이 방법이 진정한 d6보다 더 큰 중심 경향을 제공하지 않습니까?
Red_Shadow

3
@Red_Shadow No. 동전 던지기를 추가 하지는 않지만 (3 개면 충분하지 않음) 동전 으로 k 비트 이진수로 각 비트 를 선택합니다 . 따라서 [ 0..2 k - 1 ] 에서 균일하게 샘플링 하고 목표 구간이 아닌 숫자를 기각합니다. 이는 목표 구간에서 균일 한 분포 만 산출 할 수 있습니다. k[0..2k1]
Raphael

거부 된 범위로 교묘 한 경우이 경우 거부 사례에서 필요한 코인 플립 수를 줄이기 위해 실제로 사용하는 것이 쉽습니다.
Mooing Duck

@MooingDuck 당신은 2 토스 후 결과를 폐기할지 여부를 결정할 수 있습니다 : 그것이 0,0 0,1 또는 1,0이라면 마지막 비트를 위해 다시 던지십시오
ratchet freak

1
케이

7

거부 샘플링에 대한 대안 ( FrankW의 답변 에서 설명 )은 다른 동전 뒤집기와 같이 [7,8]의 답변을 고려한 스케일링 알고리즘을 사용하는 것입니다.

에 매우 자세한 설명이 있습니다 mathforum.org 에는 알고리즘을 포함하여 공식NextBit() 동전 뒤집기).

공정한 동전 (샘플링 2 → 6)으로 주사위를 던지는 경우는 일반적인 알고리즘보다 쉽습니다. 다른 코인 입력으로 실패 (7 또는 8)를하고 두 번 더 뒤집기를 수행하십시오.


2

dM을 사용하여 dN의 롤을 시뮬레이트하는 또 다른 방법은 (d2를 사용하여 d6에 특정 질문을 한 경우) 간격 [0, 1)을 길이가 1 / N, [0, 1 / N), [1 / N, 2 / N), ..., [(N-1) / N, N).

dM을 사용하여 [0, 1)에서 base-M fraction 0.bbbb ...를 생성하십시오. 그것이 [(i-1) / N, i / N)에 해당되면, i를 dN의 롤로 간주하십시오. 구간의 간격을 결정하기 위해 분수의 충분한 M 자릿수 만 생성하면됩니다.


종료 조건을보다 정확하게 만들어야합니다. 일단 동전을 뒤집 으면 이진 분수 0.0 또는 0.1 (즉 ½)로 끝나고 둘 다 간격에 해당합니다 (이 경우 각각 0과 3에 해당). 생성 된 분수를 범위로 간주해야하며 전체 범위가 단일 간격 내에 있으면 중지됩니다. 나는 그것이 당신이 의도 한 것이라고 확신하지만 그것이 명확하지 않다고 생각합니다.
rici

1

개선 된 거부 샘플링에 대한 간단한 설명입니다.

이 상황은 일부 상황에서 확률에 대한 이해 또는 분석을 단순화하는 데 도움이 될 수 있으므로이 설명을 제공합니다.

FrankW는 거부 샘플링을 사용하고, 동전을 세 번 뒤집거나, 올바른 범위에 있으면 결과를 유지하거나, 성공할 때까지 세 번 뒤집기를 반복 할 것을 제안 합니다.

Ángel은 각 시행마다 한 번의 플립을 저장하여 이전 3 개 세트에서 사용되지 않은 2 개의 값 중 나머지 바이너리 선택으로 대체 할 것을 제안 합니다.

이는 실제로 처음 세 번의 플립으로 1 비트의 정보가 생성되었으므로 생성 할 필요가 없음을 의미합니다. 보다 정확하게는 현재 플립 세트가 성공적인지 여부를 알기 위해 동전을 두 번만 뒤집어 야합니다.

성공적인 플립 세트를 해석하는 것은 확률에 독립적이기 때문에 현재 플립 세트가 성공적인지 여부를 아는 것만이 중요 합니다. 그리고 이것은 해당 세트에 대한 모든 플립이 완료되기 전에 알 수 있습니다 .

이것은 적어도 두 가지 방식으로, 또는보다 정확하게 플립의 두 가지 다른 해석으로 달성 될 수있다. 다른 사람이있을 수 있습니다.

결과를 쌍으로 그룹화

아이디어는 TT, TH, HT와 같이 3 개의 이중 플립 구성으로 표시되는 3 개의 값 (1,2), (3,4) 및 (5,6) 만 고려하는 것입니다. 그런 다음 이중 구성으로 불량 샘플링을 적용하여 고장 구성 HH를 얻을 때마다 반복 할 수 있습니다.

세 가지 성공적인 구성 중 하나를 얻으면 동전을 한 번 더 뒤집어 해당 쌍의 첫 번째 또는 두 번째 값을 취할지 결정합니다.

플립 셋 장애 조기 감지

아이디어는 3 플립 구성의 약간 다른 판독 값을 사용하는 것입니다. Head와 Tail이 1과 0으로 해석되면 구성은 이진 해석에 1을 더한 값과 일치해야합니다. 즉, TTT (즉, 000)는 1, HTH (즉, 101)는 6, HHT (즉, 110) 및 HHH (즉, 111)는 7 및 8에 해당하거나 [1,6] 이외의 항목에 해당합니다.

그런 다음 첫 두 플립만으로 플립 세트가 성공 또는 실패 함을 알 수 있습니다. HH를 생성하면 마지막 플립과 독립적으로 플립 세트가 실패합니다. 따라서 건너 뛸 수 있습니다.

초기 탐지 는 항상 설명으로 사용될 수 있다고 생각 하지만 시뮬레이션 된 주사위의 얼굴 수에 따라 가변 횟수의 뒤집기 후에 고장 감지가 발생할 수 있습니다.

예를 들어 10 개의 얼굴 주사위의 경우 원칙적으로 4 개의 플립 세트, 실패에 해당하는 6 개의 구성이 필요합니다. 트릭은 다음과 같이 이진 값 시퀀스의 최상위에 모든 실패 구성을 갖도록하는 것입니다.

TTTT  0000   1
HTTT  1000   9
HTTH  1001  10
HTHT  1001  11
HTHH  1011  12
HHTT  1100  13
HHHH  1111  16

성공적인 구성은 범위 [1, 10]에 해당하고 실패 범위는 [11,16]에 해당합니다.

그런 다음 첫 두 플립이 HH를 주거나 첫 세 플립이 HTH를 주면 세트의 누락 된 플립을 시도하지 않아도 실패합니다.

실패하지 않으면 플립 세트를 종료하기 만하면됩니다.


1

이에 대한 두 가지 잘 알려진 접근 방식이 있습니다. 하나는 "거부 샘플링"입니다. 예를 들어, 3 비트를 사용하여 6 개의 값 중 하나를 선택하고 2 개의 추가 샘플을 다시 시도하십시오. 또는 14 비트 (8192 값)를 사용하여 1 ~ 6 (7776 가능성)에서 5 개의 값을 선택하여 256 개 중 13 개에서 다시 시도하십시오.

다른 하나는 압축 / 압축 해제 알고리즘의 압축 해제 부분을 사용하는 것입니다. 산술 코딩을 사용하면 1에서 6까지의 임의의 값 시퀀스를 거의 중복없이 압축 할 수 있습니다. 압축 된 시퀀스를 임의로 생성하고 압축 해제하십시오. 이것은 훨씬 더 복잡하지만 실제로는 임의의 추가 난수가 필요하지 않습니다.


0

설명이 불필요한 경우 미리 죄송합니다. 얼마나 자세하게 설명해야하는지 또는 개념을 이해하기가 쉽지 않았습니다.

세 개의 동전 (공정한 동전)이 있다고 가정하십시오. 각 코인의 각면에 점진적으로 값을 할당하면 6 개의 값이 있습니다.

첫 번째 동전에서 머리는 1이고 꼬리는 2입니다. 두 번째 동전에서 머리는 3이고 꼬리는 4입니다. 세 번째 동전에서 머리는 5이고 꼬리는 6입니다.

동전을 뒤집 으면 세 개의 숫자 세트, 현재 세트가 남습니다. 이제 현재 세트가 이전 세트가되고 프로세스를 반복하여 새로운 세 개의 숫자 세트를 얻습니다.

하나의 숫자 만 현재 세트에서 이전 세트로 일치 할 때까지이 작업을 계속하십시오. 당신의 번호입니다.

따라서 현재 세트에 대해 [머리, 꼬리, 머리]가 있으면 [1, 4, 5]입니다. 이제 다시 뒤집 으면 현재 세트는 [2, 4, 5]입니다. 두 경기. 좋지 않다. 다시 시도하십시오. 당신은 [2, 3, 6]을 얻는다. 하나만 일치합니다. 전화 번호는 2입니다.

주어진 숫자가 나타날 확률은 동일하지만, 주어진 세트 쌍이 성공할 경우 3/32 만 변경된다는 점을 고려할 때 특히 비용 효율적이지는 않습니다 (하나만 일치). 따라서 평균적으로 알고리즘은 약 10 회 반복되어야합니다. 또한 홀수 번째 다이로 쉽게 일반화 할 수 없습니다.

최소한, 아마도 그것은 생각을위한 음식 일 것입니다. 매우 흥미로운 질문입니다.


4
이것은 항상 거부 샘플링보다 훨씬 큰 성능을 발휘합니다. 거부 샘플링의 경우 뒤집기 만하면됩니다.로그 시뮬레이션 동전 -사이드 다이와 각 플립 세트는 확률보다 더 큰 확률로 성공합니다 12. 제안하는 방법은 뒤집어 야합니다.2 동전과 각 플립 세트는 확률로만 성공합니다 /2.
David Richerby

0

나는 동전을 세 번 뒤집어 그 결과를 이진수로 해석하여 범위를 벗어난 결과를 거부합니다.

예를 들어 heads를 1로하고 tails를 0으로 설정합니다. 세 번 뒤집어 머리, 꼬리, 머리를 얻으면 이진수 101 (10 진수 5)을 갖게됩니다. HHT = 110b = 6. TTT = 000b = 0 및 HHH = 111b = 7, 둘 다 범위를 벗어 났으며 거부되며 모든 숫자에 대해 다시 표시됩니다.


1
프랭크의 대답 일뿐입니다.
Raphael

2
@Raphael 실제로 Frank는 예상 실행 시간을 다루기 때문에 Frank 의 답변의 엄격한 하위 집합입니다 .
David Richerby

0

불행히도 공정한 동전을 사용하여 (충실한) 주사위를 시뮬레이션 할 수 없습니다.

단순히 다이의 이벤트 공간의 차원이 6 그리고 이것의 거듭 제곱과 정확히 일치 할 수는 없습니다 2 (이것은 공정한 동전의 이벤트 공간이 제공하는 것입니다).

그러나 공정한 "트리 코인"(이러한 용어를 사용할 수있는 경우)으로이를 수행 할 수 있습니다. 3 결과와 동전을 의미합니다. 그리고 간단한 2 코인이므로이 2 개의 코인의 연결 공간은 다이의 이벤트 공간과 정확히 일치합니다.

거부 샘플링 (일부 답변에서 언급 한 바와 같이)은 대략적인 시뮬레이션을 제공 할 수 있습니다 . 그러나 여전히 많은 양의 오차 또는 확률의 불일치 (유한 한 시간)가 있습니다. 따라서이 두 시스템의 이벤트 공간을 실제로 일치시키려는 경우 작동하지 않을 수 있습니다.

확률 적 시뮬레이션 (거부 샘플링이 예시 임)에서, 생성 된 전형적인 시퀀스는 실제로 상대적인 기본 확률 (이 경우 다이의 이벤트 공간)을 나타낸다. 그러나 (주석에서 언급 한 바와 같이) 이들 전형적인 서열 각각 은 정확히 동일한 결과의 임의의 긴 하위 서열을 포함 할 수있다 . 즉, 거부 샘플링 (일부 경우)을 사용하려면 임의의 시간이 걸리거나 생성 된 분포가 이벤트 공간의 일부 또는 과다 표현 또는 과소 표현으로 인해 편중됩니다 (즉, 공정한 다이가 아님). . 그렇지 않은 경우, 주사위와 동전의 이벤트 공간과 정확하게 일치하는 결정 론적 알고리즘이 가능합니다 (차원성에 맞지 않음).


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Gilles 'SO- 악마 그만해'

@Gilles는 나쁘지 부정 투표는 갔다 모든 설명과 (정확성에로) 채팅에도 불구하고, 아직 여기입니다 : P
니 코스 M.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.