¿Esto introducirá un sesgo en lo que deberían ser números aleatorios?

11

Suponga un archivo de datos con más de 80 millones de unos y ceros, generados aleatoriamente.

A partir de este archivo, queremos crear una lista de enteros decimales aleatorios.

Este es el plan para hacer esta conversión.

  1. Divida los 80 millones de dígitos en grupos de 4 dígitos binarios.
  2. Convierta cada binario de 4 dígitos a decimal.
  3. Descarte todos los valores decimales mayores que 9.

Esto debería dar como resultado una cadena de enteros aleatorios de 0-9

Aquí está la preocupación. Los 24 dígitos binarios que comprenden las 6 agrupaciones de 4 dígitos binarios que corresponden a los valores 10 a 15 contienen 17 unidades y solo 7 ceros. ¿Este desequilibrio afectará la distribución de los enteros pares frente a los impares, o comprometerá la aleatoriedad de la cadena final de dígitos decimales de alguna manera?

Actualización: De las respuestas publicadas, parece que el método enumerado anteriormente es sólido. Estoy de acuerdo con esa conclusión. Sin embargo, todavía no entiendo por qué eliminar más del doble de ceros de la cadena binaria no sesga el resultado hacia menos números impares. Busco explicaciones.

Joel W.
fuente
99
Existen métodos más eficientes. Por ejemplo, podría dividir la cadena de bits en grupos de 10, convertirlos en sus representaciones de tres dígitos base 10 y descartar cualquiera con valores de 1000 o más. Esto utilizaría el 97.6% de los bits en lugar de solo el 62.5% de ellos. No puedes hacer mucho mejor que eso. (Puede usar grupos de 681 y convertirlos en cadenas de base 10 de 205 dígitos, utilizando así casi el 99.7% de los bits.)
whuber

Respuestas:

18

Vamos a contar y ver. Mediante la construcción del archivo, todas las cadenas de 4 bits son igualmente probables. Hay 16 cadenas de este tipo. Aquí están:

 0. 0000
 1. 0001
 2. 0010
 3. 0011
 4. 0100
 5. 0101
 6. 0110
 7. 0111
 8. 1000
 9. 1001
10. 1010
11. 1011
12. 1100
13. 1101
14. 1110
15. 1111

Su procedimiento arroja las cadenas del 10 al 15. Por lo tanto, en los casos que realmente usa, elegirá del 0 al 9, cada uno de los cuales es igualmente probable, según lo deseado. Y sabemos que los dígitos decimales generados son independientes entre sí porque cada uno usa una cadena separada de 4 bits y todos los bits son independientes. Su procedimiento constituye un tipo simple de muestreo de rechazo .

Kodiólogo
fuente
55
Veo esa lógica claramente. Sin embargo, me preocupa descartar más 1 binarios que 0. ¿Por qué ese desequilibrio no tiene ningún impacto?
Joel W.
55
@JoelW Supongo que no veo tu argumento. La distribución final se refiere a dígitos decimales, no a bits, por lo que la distribución de bits es irrelevante.
Kodiólogo
77
Esto es correcto, pero solo aborda parcialmente la pregunta. Para abordar el "compromiso de aleatoriedad ... de cualquier manera" parte de la pregunta, uno también tiene que establecer que los dígitos decimales resultantes son, en una excelente aproximación, independientes . Para completar, vale la pena dedicar una oración de explicación a ese resultado (obvio).
whuber
77
Joel, veo de dónde vienes. Puede haber una percepción errónea aquí: no puede revertir el proceso. Si quisiera reconstruir una secuencia de bits a partir de la secuencia de dígitos decimales, tendría que hacer algo como eliminar todos los 8 y 9 y convertir los dígitos restantes en triples binarios. Eso restaurará el equilibrio. De hecho, es fácil ver que este "viaje de ida y vuelta" equivale a dividir su flujo original en nybbles de cuatro bits y descartar sus bits más significativos, dejando una secuencia agradable distribuida uniformemente de 60 millones de bits.
whuber
1
@whuber lo suficientemente justo; adicional.
Kodiólogo
4

No hay sesgo ya que simplemente simula algunos valores que se descartan y todos los valores, incluidos los que se mantienen, se generan con la misma probabilidad: ingrese la descripción de la imagen aquí

El código R para el gráfico anterior es

generza=matrix(sample(0:1,4*1e6,rep=TRUE),ncol=4)
uniz=generza[,1]+2*generza[,2]+4*generza[,3]+8*generza[,4]
barplot(hist(uniz[uniz<10],breaks=seq(-0.5,9.5,le=11))$counts,col="steelblue")
Xi'an
fuente