Loading [MathJax]/jax/element/mml/optable/BasicLatin.js

19 votos

¿Dibujar números enteros de forma independiente y uniforme al azar de 1 aN usando fair d6?

Quiero llamar números enteros de 1 a determinados N a rodar por algún número de la feria de seis caras de los dados (d6). Una buena respuesta podría explicar por qué su método produce uniforme e independiente de los números enteros.

Como un ejemplo ilustrativo, sería útil para explicar cómo una solución que funciona para el caso de N=150.

Asimismo, deseo para que el procedimiento sea lo más eficiente posible: roll el menor número de d6, en promedio, para cada número generado.

Las conversiones de senary a decimal son permisibles.


Esta pregunta fue inspirado por esta Meta hilo.

12voto

jldugger Puntos 7490

El conjunto Ω(d,n) de distinta identificable resultados en n independiente rollos de morir con d=6 caras ha dn elementos. Cuando el morir es justo, que significa cada uno de los resultados de un rollo ha probabilidad de 1/d e independencia significa cada uno de estos resultados por lo tanto, tienen probabilidad de (1/d)n: es decir, tienen una distribución uniforme Pd,n.

Supongamos que se han ideado algunos de procedimiento t determina que cualquiera de las m resultados de una c(=150)colindado mueren, es decir, un elemento de Ω(c,m)- o más informes de fallo (lo que significa que usted tendrá que repetir con el fin de obtener un resultado). Es decir,

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

Let F be the probability t results in failure and note that F is some integral multiple of dn, say

F=Pr

(For future reference, note that the expected number of times t must be invoked before not failing is 1/(1-F).)

The requirement that these outcomes in \Omega(c,m) be uniform and independent conditional on t not reporting failure means that t preserves probability in the sense that for every event \mathcal{A}\subset\Omega(c,m),

\frac{\mathbb{P}_{d,n}\left(t^{*}\mathcal{A}\right)}{1-F}= \mathbb{P}_{c,m}\left(\mathcal{A}\right) \tag{1}

where

t^{*}\left(\mathcal A\right) = \{\omega\in\Omega\mid t(\omega)\in\mathcal{A}\}

is the set of die rolls that the procedure t assigns to the event \mathcal A.

Consider an atomic event \mathcal A = \{\eta\}\subconjunto\Omega(c,m), which must have probability c^{m}. Let t^{*}\left(\mathcal A\right) (the dice rolls associated with \eta) have N_\eta elements. (1) becomes

\frac{N_\eta d^{-n}}{1 - N_F d^{-n}} = \frac{\mathbb{P}_{d,n}\left(t^{*}\mathcal{A}\right)}{1-F}= \mathbb{P}_{c,m}\left(\mathcal{A}\right) = c^{-m}.\tag{2}

It is immediate that the N_\eta are all equal to some integer N. It remains only to find the most efficient procedures t. The expected number of non-failures per roll of the c sided die is

\frac{1}{m}\left(1 - F\right).

There are two immediate and obvious implications. One is that if we can keep F small as m grows large, then the effect of reporting a failure is asymptotically zero. The other is that for any given m (the number of rolls of the c-sided die to simulate), we want to make F as small as possible.

Let's take a closer look at (2) by clearing the denominators:

N c^m = d^n - N_F \gt 0.

This makes it obvious that in a given context (determined by c,d,n,m), F is made as small as possible by making d^n-N_F equal the largest multiple of c^m that is less than or equal to d^n. We may write this in terms of the greatest integer function (or "floor") \lfloor*\rfloor as

N = \lfloor \frac{d^n}{c^m} \rfloor.

Finally, it is clear that N ought to be as small as possible for highest efficiency, because it measures redundancy in t. Specifically, the expected number of rolls of the d-sided die needed to produce one roll of the c-sided die is

N \times \frac{n}{m} \times \frac{1}{1-F}.

Thus, our search for high-efficiency procedures ought to focus on the cases where d^n is equal to, or just barely greater than, some power c^m.

The analysis ends by showing that for given d and c, there is a sequence of multiples (n,m) for which this approach approximates perfect efficiency. This amounts to finding (n,m) for which d^n/c^m \ge 1 approaches N=1 in the limit (automatically guaranteeing F\a 0). One such sequence is obtained by taking n=1,2,3,\ldots and determining

m = \lfloor \frac{n\log d}{\log c} \rfloor.\tag{3}

The proof is straightforward.

This all means that when we are willing to roll the original d-sided die a sufficiently large number of times n, we can expect to simulate nearly \log d / \log c = \log_c d outcomes of a ccolindado mueren por rollo. Equivalentemente,

Es posible simular un gran número de m independiente de rollos de una ccolindado muere el uso de una feria de dcolindado mueren utilizando un promedio de \log(c)/\log(d) + \epsilon = \log_d(c) + \epsilon rollos por resultado que \epsilon puede hacerse arbitrariamente pequeña eligiendo m lo suficientemente grande.


Ejemplos de algoritmos y

En la pregunta, d=6 e c=150, dónde

\log_d(c) = \frac{\log(c)}{\log(d)} \approx 2.796489.

Thus, the best possible procedure will require, on average, at least 2.796489 rolls of a d6 to simulate each d150 outcome.

The analysis shows how to do this. We don't need to resort to number theory to carry it out: we can just tabulate the powers d^n=6^n and the powers c^m=150^m and compare them to find where c^m \le d^n are close. This brute force calculation gives (n,m) pairs

(n,m) \in \{(3,1), (14,5), \ldots\}

for instance, corresponding to the numbers

(6^n, 150^m) \in \{(216,150), (78364164096,75937500000), \ldots\}.

In the first case t would associate 216-150=66 of the outcomes of three rolls of a d6 to Failure and the other 150 outcomes would each be associated with a single outcome of a d150.

In the second case t would associate 78364164096-75937500000 of the outcomes of 14 rolls of a d6 to Failure -- about 3.1% of them all -- and otherwise would output a sequence of 5 outcomes of a d150.

A simple algorithm to implement t labels the faces of the d-sided die with the numerals 0,1,\ldots d, d-1 and the faces of the c-sided die with the numerals 0,1,\ldots, c-1. The n rolls of the first die are interpreted as an n-digit number in base d. This is converted to a number in base c. If it has at most m digits, the sequence of the last m digits is the output. Otherwise, t returns Failure by invoking itself recursively.

For much longer sequences, you can find suitable pairs (n,m) by considering every other convergent n/m of the continued fraction expansion of x=\log(c)/\log(d). The theory of continued fractions shows that these convergents alternate between being less than x and greater than it (assuming x is not already rational). Choose those that are less than x.

In the question, the first few such convergents are

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

In the last case, a sequence of 29,036,139 rolls of a d6 will produce a sequence of 10,383,070 rolls of a d150 with a failure rate less than 2\veces 10^{-8}, for an efficiency of 2.79649--indistinguibles desde el límite asintótico.

7voto

user777 Puntos 10934

Para el caso de N=150, tirar un d6 tres veces claramente crea 6^3=216 de los resultados.

El resultado deseado puede ser tabulados en esta forma:

  • Grabar un d6 tres veces de forma secuencial. Esto produce resultados a,b,c. El resultado es uniforme ya que todos los valores de a,b,c son igualmente probables (los dados son justos, y estamos tratando a cada rollo distinto).
  • Resta 1 de cada.
  • Este es un senary número: cada uno de los dígitos (valor posicional) va de 0 a 5 por potencias de 6, así que usted puede escribir el número en decimal usando (a-1) \times 6^2 + (b-1) \times 6^1 + (c-1)\times 6^0
  • Añadir 1.
  • Si el resultado excede de 150, descartar el resultado y se vuelve a tirar.

La probabilidad de mantener un resultado es p=\frac{150}{216}=\frac{25}{36}. Todos los rollos son independientes, y volvemos a repetir el procedimiento hasta que el "éxito" (un resultado en 1,2,\dots,150) por lo que el número de intentos para generar 1 empate entre 1 y 150 se distribuye como una variable aleatoria geométrica, que tiene la expectativa p^{-1}=\frac{36}{25}. Por lo tanto, el uso de este método para generar 1 empate requiere de rodadura \frac{36}{25}\times 3 =4.32 rollos de dados en promedio (porque cada intento de rollos de 3 dados).


Crédito a @whuber para lo que sugiere que esta en el chat.

5voto

Aaron Puntos 36

Aquí aún es una alternativa más simple a la respuesta por Sycorax para el caso de que N=150. Desde 150 = 5 \times 5 \times 6 puede realizar el siguiente procedimiento:

La generación de uniforme número aleatorio de 1 a 150:

  • Hacer tres ordenó rollos de 1D6 y denotan estas como R_1, R_2, R_3.
  • Si cualquiera de los dos primeros rollos es un seis, rebollo hasta que no es 6.
  • El número de (R_1, R_2, R_3) es un número uniforme utilizando la notación posicional con una base de 5-5-6. Por lo tanto, usted puede calcular el número deseado como: X = 30 \cdot (R_1-1) + 6 \cdot (R_2-1) + (R_3-1) + 1.

Este método puede ser generalizado a mayor N, pero se vuelve un poco más difícil cuando el valor de uno o más factores primos de más de 6.

2voto

Alan Puntos 7273

Como una ilustración de un algoritmo para elegir de manera uniforme entre las 150 valores de uso de seis caras de los dados, prueba esta que utiliza cada rollo de multiplicar los valores disponibles por 6 y hacer que cada uno de los nuevos valores igualmente probables:

  • Después de 0 rollos, usted tiene 1 posibilidad, no lo suficiente como para distinguir a 150 valores
  • Después de 1 roll, ha 6 posibilidades, no lo suficiente como para distinguir a 150 valores
  • Después de 2 rollos, usted tiene 36 posibilidades, no lo suficiente como para distinguir a 150 valores
  • Después de 3 rollos, usted tiene 216 posibilidades, lo suficiente como para distinguir a 150 valores pero con 66 restante de los valores; la probabilidad de parar ahora es \frac{150}{216}
  • Si no se han detenido, a continuación, después de 4 rollos ha 396 restante posibilidades, lo suficiente como para distinguir a 150 valores de dos maneras, pero con 96 restante de los valores; la probabilidad de parar ahora es \frac{300}{1296}
  • Si no se han detenido, a continuación, después de 5 rollos ha 576 restante posibilidades, lo suficiente como para distinguir a 150 valores de tres maneras pero con 96 restante de los valores; la probabilidad de parar ahora es \frac{450}{7776}
  • Si no se han detenido, a continuación, después de 6 rollos ha 756 restante posibilidades, lo suficiente como para distinguir a 150 valores de cinco maneras pero con 6 restante de los valores; la probabilidad de parar ahora es \frac{750}{46656}

Si usted está en una de las 6 restante de los valores después de la 6 rollos entonces usted está en una situación similar a la de la posición después de la 1 roll. Así que usted puede continuar de la misma manera: la probabilidad de dejar después de 7 rollos es \frac{0}{279936}, después de 8 rollos es \frac{150}{1679616} etc.

Agregar estas arriba y te encuentras con que el número esperado de rollos necesarios es acerca de 3.39614. Proporciona un uniforme de la selección de la 150, ya que sólo seleccione un valor en un tiempo cuando usted puede seleccionar cada una de las 150 , con igual probabilidad


Sycorax pedido en los comentarios de una forma más explícita algoritmo

  • En primer lugar, voy a trabajar en base-6 con 150_{10}=410_6
  • Segundo, en vez de los valores de destino 1_6 a 410_6, voy a restar uno para los valores objetivo se 0_6 a 409_6
  • En tercer lugar, cada morir debe tener los valores de 0_6 a 5_6, y el rodar de una matriz consiste en la adición de una base 6 dígitos a la derecha de la actual número generado. Los números que se generan pueden tener ceros a la izquierda, y su número de dígitos es el número de rollos hasta ahora

El algoritmo se sucesivos dados:

  • Rollo de la primera de tres dados para generar un número de 000_6 a 555_6. Desde 1000_6 \div 410_6 = 1_6 \text{ remainder } 150_6 usted toma el valor generado (que también es su resto en la división por 410_6) si el valor generado es estrictamente por debajo de 1000_6-150_6=410_6 y parada;

  • Si continua, rollo de la cuarta morir así que ahora ha generado un gran número de 4100_6 a 5555_6. Desde 10000_6 \div 410_6 = 12_6 \text{ remainder } 240_6 tomar el resto del valor generado en la división por 410_6 si el valor generado es estrictamente por debajo de 10000_6-240_6=5320_6 y parada;

  • Si continua, rollo de la quinta morir así que ahora ha generado un gran número de 53200_6 a 55555_6. Desde 100000_6 \div 410_6 = 123_6 \text{ remainder } 330_6 tomar el resto del valor generado en la división por 410_6 si el valor generado es estrictamente por debajo de 100000_6-330_6=55230_6 y parada;

  • Si continua, rollo de la sexta morir así que ahora ha generado un gran número de 552300_6 a 555555_6. Desde 1000000_6 \div 410_6 = 1235_6 \text{ remainder } 10_6 tomar el resto del valor generado en la división por 410_6 si el valor generado es estrictamente por debajo de 1000000_6-10_6=555550_6 y parada;

  • etc.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X