Cómo simular un dado con una moneda justa


21

Suponga que le dan una moneda justa y le gustaría simular la distribución de probabilidad de voltear repetidamente un dado justo (de seis caras). Mi idea inicial es que necesitamos elegir enteros apropiados , de modo que . Entonces, después de voltear la moneda veces, mapeamos el número codificado por la cadena de bits de longitud k a las salidas del dado dividiendo el rango en 6 intervalos cada uno de longitud . Sin embargo, esto no es posible, ya que tiene dos como su único factor primo, pero los factores primos de incluyen tres. Debería haber alguna otra forma simple de hacer esto, ¿verdad?2 k = 6 m k [ 0 , 2 k - 1 ] m 2 k 6 mk,m2k=6mk[0,2k1]m2k6m


Vea esta pregunta donde se trata el problema de una manera más general.
Raphael

Aquí hay un artículo sobre el tema . Explica cómo usar el muestreo de rechazo y cómo reutilizar los bits "desperdiciados" para acelerar más rollos.
ZeroUltimax

Respuestas:


12

Para tener un método un poco más eficiente que el señalado por @FrankW pero usando la misma idea, puede voltear su moneda veces para obtener un número por debajo de 2 n . Luego, interprete esto como un lote de m dado, donde m es el número más grande de modo que 6 m < 2 n (como ya se dijo, la igualdad nunca se cumple aquí). Si obtiene un número mayor o igual a 6 m , debe rechazar el valor y repetir todos los n flips.n2nmm6m<2n6mn

Puede implementar una función que devuelve un solo lanzamiento de dado haciendo lanzamientos de monedas y luego almacenar en caché el resultado para las siguientes solicitudes de lanzamiento de dado m - 1 .nm1

El punto interesante es que algunos valores de son mejores que otros porque tienen una tasa de rechazo menor. Aquí hay una lista de buenos valores (es decir, valores que tienen una tasa de rechazo menor que los anteriores):n

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

obtenido con las fórmulas: .

m=nlog32r=13m2n

La primera fila corresponde a la respuesta de @FrankW con una tasa de rechazo del 25%. Los siguientes números son agradables: y n = 13 tanto se puede mantener en una variable único entero estática. En particular, la tasa de rechazo de n = 13 es solo del 5%, lo cual es una mejora razonable con respecto al 25% y lo convierte en un buen candidato para una posible implementación.n=8n=13n=13


No necesita 6 ^ m, 6 * m es suficiente. Por lo tanto, podría usar 5 lanzamientos para obtener un número de 5 bits que rechaza solo 1/16 casos.
Taemyr

La tasa de rechazo del 5% para 13 lanzamientos es horrible, en comparación con el 25% para 3 lanzamientos. Porque el 25% de 3 lanzamientos solo rechazará 4 veces (es decir, gastará más de 12 lanzamientos) en el 0.390625% de los casos.
Taemyr

@Taemyr, un número de 5 bits puede representar 32 valores diferentes, lo que le permite representar un solo dado (porque dos dados tienen 36 posibilidades). Entonces, solo los valores de 6/32 son aceptables con una tasa de rechazo de 27/32 = 84%
Emanuele Paolini

@Taemyr: una tasa de rechazo de en n lanzamientos significa que, en promedio, cada lote de n lanzamientos se rechaza con probabilidad r . Entonces, en promedio, cada lanzamiento se rechaza con la misma tasa r (sin depender de n ). rnnrrn
Emanuele Paolini

Sí. Y utilizando el método de FrankW que tiene una tasa de rechazo del 25% para un lote de 3 lanzamientos, tendría una probabilidad de 1-0.00390625 para aceptar antes del cuarto lote.
Taemyr

29

Lo que puede hacer es emplear un método llamado muestreo de rechazo :

  • Lanza la moneda 3 veces e interpreta cada lanzamiento como un bit (0 o 1).
  • Concatenar los 3 bits, dando un número binario en .[0,7]
  • Si el número está en , tómalo como un dado.[1,6]
  • De lo contrario, es decir, si el resultado es o 7 , repita los saltos.07

Desde de los posibles resultados conducen a la terminación en cada serie, la probabilidad de necesitar más de1 seriede lanzamientos para obtener una tirada de dados es(1-668l . Por lo tanto, este método es eficiente en la práctica.(168)l=14l

Mejoras:

La respuesta de @ Angel señala que el número de monedas se lanza en cada conjunto, pero el primero se puede reducir de 3 a 2, utilizando la distinción entre un y un 7 como el primer bit para el siguiente conjunto.07

@Emanuele Paolini explica cómo puede reducir la cantidad de vueltas, si necesita múltiples tiradas de dado.


¿No daría este método una mayor tendencia central que un verdadero d6?
Red_Shadow

3
@Red_Shadow No. Tenga en cuenta que no agrega los lanzamientos de monedas (tres no serían suficientes, entonces) pero elige cada bit en un número binario de bits por moneda. Por lo tanto, muestra de manera uniforme de [ 0..2 k - 1 ] y rechaza los números que no pertenecen al intervalo objetivo; Esto solo puede producir una distribución uniforme en el intervalo objetivo. k[0..2k1]
Raphael

Si eres astuto con el rango rechazado, en realidad es fácil en este caso usar eso para reducir el número de lanzamientos de monedas necesarios en el caso de rechazo.
Mooing Duck

@MooingDuck puede decidir si descarta su resultado después de 2 lanzamientos: si es 0,0 0,1 o 1,0, vuelva a tirar para el último bit, de lo contrario, comience de nuevo
monstruo de trinquete

1
k

7

Una alternativa al muestreo de rechazo (como se describe en la respuesta de FrankW ) es utilizar un algoritmo de escala, que tenga en cuenta una respuesta de [7,8] como si fuera otro lanzamiento de moneda.

Hay una explicación muy detallada en mathforum.org , que incluye el algoritmo ( NextBit()sería lanzar su moneda justa).

El caso para lanzar un dado con una moneda justa (muestreo 2 → 6) es más fácil que el algoritmo genérico. Simplemente toma una falla (7 u 8) como otra entrada de moneda y realiza dos lanzamientos más.


2

Otro enfoque para simular una tirada de un dN usando un dM (en el caso de la pregunta específica hecha a un d6 usando un d2) es dividir el intervalo [0, 1) en N intervalos iguales de longitud 1 / N, [0, 1 / N), [1 / N, 2 / N), ..., [(N-1) / N, N).

Use el dM para generar una fracción base-M, 0.bbbb ..., en [0, 1). Si eso cae en [(i-1) / N, i / N), tome i como la tirada de dN. Tenga en cuenta que solo tiene que generar suficientes dígitos de base M de la fracción para determinar en qué intervalo se encuentra.


La condición de terminación debe hacerse más precisa. Si lanzo la moneda una vez que termino con la fracción binaria 0.0 o 0.1 (es decir, ½), ambas caen en un intervalo (correspondiente a 0 y 3, respectivamente, en este caso). Debe considerar la fracción generada como un rango y se detiene cuando todo el rango está dentro de un solo intervalo. Estoy seguro de que eso es lo que pretendías, pero no creo que esté claro.
rici

1

Una explicación posiblemente más simple del muestreo de rechazo mejorado.

Estoy dando esta explicación, ya que con suerte puede ayudar a simplificar la comprensión o el análisis de probabilidades en algunas situaciones.

FrankW sugiere usar el muestreo de rechazo, lanzar la moneda tres veces, mantener el resultado si está en el rango correcto o repetir los tres lanzamientos de otra manera, hasta el éxito.

Ángel sugiere guardar un cambio en cada prueba, reemplazándolo por la opción binaria restante de los dos valores no utilizados del conjunto anterior de tres.

Esto significa realmente que se produjo un poco de información con los primeros tres cambios, que no fue necesario producir. Más precisamente, debería lanzar la moneda solo dos veces para saber si el conjunto actual de lanzamientos será exitoso.

Saber si el conjunto actual de flip será exitoso es la única probabilidad que importa , ya que interpretar un conjunto exitoso de flip es independiente de la probabilidad. Y esto se puede saber antes de que se completen todos los cambios para ese conjunto.

Esto se puede lograr al menos de dos maneras, o más precisamente en dos interpretaciones diferentes de los cambios. Puede haber otros.

Resultados de agrupamiento en pares

La idea es considerar solo tres valores (1,2), (3,4) y (5,6) representados por tres configuraciones de doble vuelta, digamos TT, TH, HT. Luego, puede aplicar el muestreo de rechazo con doble vuelta, repitiendo cada vez que obtenga la configuración de falla HH.

Una vez que obtenga una de las tres configuraciones exitosas, simplemente voltee la moneda una vez más para decidir si debe tomar el primer o el segundo valor del par correspondiente.

Detección temprana de falla de flip-set

La idea es utilizar una lectura ligeramente diferente de la configuración de tres vueltas. Si Head y Tail se interpretan como 1 y 0, entonces una configuración debe corresponder a la interpretación binaria más uno. Es decir, TTT (es decir, 000) corresponde a 1, HTH (es decir, 101) corresponde a 6, HHT (es decir, 110) y HHH (es decir, 111) corresponde a 7 y 8, o cualquier cosa fuera [1,6].

Entonces sabemos que el flip-set tiene éxito o falla solo con los dos primeros flips. Si producen HH, el flip set falla independientemente del último flip. Por lo tanto, se puede omitir.

Creo que la detección temprana siempre se puede usar como explicación, pero dependiendo de la cantidad de caras en sus dados simulados, la detección de fallas puede ocurrir después de un número variable de lanzamientos.

Por ejemplo, para un dado de 10 caras necesitas, en principio, un juego de 4 lanzamientos, con 6 configuraciones correspondientes a la falla. El truco es tener todas las configuraciones de falla en el extremo superior de la secuencia de valores binarios de la siguiente manera:

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

Las configuraciones exitosas corresponden al rango [1, 10] y las fallas al rango [11,16].

Luego fallas cuando los dos primeros lanzamientos dan HH, o cuando los primeros tres dan HTH, sin siquiera tener que intentar los lanzamientos faltantes del conjunto.

Si no falla, simplemente termina el conjunto de volteretas.


1

Hay dos enfoques bien conocidos para esto. Uno es el "muestreo de rechazo". Por ejemplo, use tres bits para elegir uno de los seis valores, intente nuevamente con las dos muestras adicionales. O use 14 bits (8192 valores) para seleccionar 5 valores de 1 a 6 (7776 posibilidades), intente nuevamente en 13 de 256 casos.

El otro está utilizando la parte de descompresión de un algoritmo de compresión / descompresión: con la codificación aritmética, una secuencia de valores aleatorios de 1 a 6 puede comprimirse casi sin redundancia. Genere la secuencia comprimida al azar y descomprímala. Esto es mucho más complicado, pero prácticamente no requerirá ningún número aleatorio adicional.


0

Lo siento de antemano si la explicación es superflua. No estaba seguro de cuántos detalles entrar o qué tan fácil era entender el concepto.

Digamos que tienes tres monedas (monedas justas). Si asigna un valor de forma incremental a cada lado de cada moneda, tendrá seis valores.

Así: en la primera moneda, las caras son 1 y las colas son 2. En la segunda moneda, las caras son 3 y las colas es 4. En la tercera moneda, las caras son 5 y las colas son 6.

Voltear las monedas te dejará con un conjunto de tres números, tu conjunto actual. Ahora, su conjunto actual se convertirá en su conjunto anterior y repetirá el proceso para obtener un nuevo conjunto de tres números.

Continúe haciendo esto hasta que uno y solo un número coincida desde su conjunto actual al anterior. Ese es tu numero.

Entonces, si obtuviste [cara, cruz, cara] para el conjunto actual, sería [1, 4, 5]. Ahora los voltea de nuevo y su conjunto actual es [2, 4, 5]. Dos partidos No es bueno. Vuelve a intentarlo. Obtienes [2, 3, 6]. Solo un partido. Tu número es dos.

Habrá la misma posibilidad de que aparezca cualquier número dado, pero no es particularmente rentable, dado que solo hay un cambio de 3/32 de que cualquier par de conjuntos tendrá éxito (solo una coincidencia). Entonces, en promedio, el algoritmo tendría que repetirse unas diez veces. Además, no es fácilmente generalizable a un dado impar.

Por lo menos, tal vez sea algo para pensar. Pregunta muy interesante


44
lognn12n2n/2n

0

Lanzaría la moneda tres veces e interpretaría el resultado como un número binario, rechazando los resultados fuera de rango.

Por ejemplo, deje que las cabezas sean un 1 y las colas sean 0. Si lo voltea tres veces y obtiene caras, colas, cabezas, tendría el binario 101, que es 5 en decimal. HHT = 110b = 6. TTT = 000b = 0 y HHH = 111b = 7, los cuales están fuera de rango y serían rechazados, y usted volvería a voltear para todos los dígitos.


1
Esa es solo la respuesta de Frank.
Raphael

2
@Raphael En realidad, un subconjunto estricto de la respuesta de Frank , ya que Frank aborda el tiempo de ejecución esperado.
David Richerby

0

Lamentablemente, uno no puede (fielmente) simular un dado (justo) usando (secuencias de) monedas justas.

62

Pero uno puede hacer esto con una "tri-moneda" justa (si se puede usar dicho término). Significa una moneda con 3 resultados. Y una simple moneda de 2 monedas, por lo que el espacio conjunto de estas 2 monedas coincide exactamente con el espacio de evento del dado.

El muestreo de rechazo (como se menciona en algunas respuestas) puede proporcionar una simulación aproximada . Pero aún tendrá una cantidad de error o coincidencia de probabilidades (en tiempo finito). Por lo tanto, si uno quiere hacer coincidir los espacios de eventos de estos 2 sistemas, habrá casos en que no funcionará.

En la simulación probabilística (de la cual el muestreo de rechazo es un ejemplo), las secuencias típicas generadas exhiben las probabilidades elementales relativas (en este caso, el espacio de eventos de un dado). Sin embargo (como se menciona en los comentarios), cada una de estas secuencias típicas puede contener subsecuencias arbitrariamente largas de exactamente los mismos resultados. Esto significa que para usar el muestreo de rechazo (en algunos casos) puede tomar arbitrariamente largo o la distribución generada estará sesgada (es decir, no muere), debido a la sobrerrepresentación o subrepresentación de algunas partes de su espacio de eventos . Si este no fuera el caso, entonces sería posible un algoritmo determinista que coincidiría exactamente con los espacios de eventos de un dado y una moneda (que no coinciden por dimensionalidad).


Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
Gilles 'SO- deja de ser malvado'

@Gilles, lástima que el voto negativo todavía esté aquí, a pesar de todas las explicaciones y conversaciones (en cuanto a la corrección) que sucedieron: p
Nikos M.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.