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 m
probability-theory
randomness
sampling
probabilidad_guy
fuente
fuente
Respuestas:
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.norte 2norte metro metro 6 6metro< 2norte 6 6metro norte
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 .norte m - 1
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):norte
obtenido con las fórmulas: .
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 = 8 n = 13 n = 13
fuente
Lo que puede hacer es emplear un método llamado muestreo de rechazo :
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-66 68 l . Por lo tanto, este método es eficiente en la práctica.( 1 - 68)l= 14 4l
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.0 0 7
@Emanuele Paolini explica cómo puede reducir la cantidad de vueltas, si necesita múltiples tiradas de dado.
fuente
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.
fuente
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.
fuente
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:
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.
fuente
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.
fuente
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
fuente
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.
fuente
Lamentablemente, uno no puede (fielmente) simular un dado (justo) usando (secuencias de) monedas justas.
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).
fuente