Extracción de bolas de una urna
Hoy vamos a usar listas para representar objetos de un experimento aleatorio.
En lugar de pensar solo en números, pensaremos en una urna que contiene bolas de distintos colores.
Con Python podremos:
Una lista es una estructura que permite guardar varios valores en un solo objeto.
Por ejemplo:
Salida:
Aquí cada elemento de la lista representa una bola dentro de la urna.
Porque una lista nos permite representar de manera muy natural un experimento.
Si tenemos una urna con:
podemos escribir:
Cada aparición en la lista cuenta como una bola real.
Para seleccionar un elemento al azar de una lista usamos random.choice().
Cada vez que ejecutes el código puede salir un resultado distinto.
Si la urna es:
entonces hay:
Por tanto,
\[ P(\text{roja}) = \frac{3}{6} \]
\[ P(\text{azul}) = \frac{2}{6} \]
\[ P(\text{verde}) = \frac{1}{6} \]
La simulación nos ayuda a aproximar estas probabilidades.
Si repetimos el experimento muchas veces, podemos contar cuántas veces aparece cada color.
import random
urna = ["roja", "roja", "roja", "azul", "azul", "verde"]
rojas = 0
azules = 0
verdes = 0
for i in range(1000):
bola = random.choice(urna)
if bola == "roja":
rojas += 1
elif bola == "azul":
azules += 1
else:
verdes += 1
print("Rojas:", rojas)
print("Azules:", azules)
print("Verdes:", verdes)Para aproximar probabilidades, dividimos entre el número total de extracciones.
import random
urna = ["roja", "roja", "roja", "azul", "azul", "verde"]
rojas = 0
azules = 0
verdes = 0
n = 1000
for i in range(n):
bola = random.choice(urna)
if bola == "roja":
rojas += 1
elif bola == "azul":
azules += 1
else:
verdes += 1
print("Frecuencia de roja:", rojas / n)
print("Frecuencia de azul:", azules / n)
print("Frecuencia de verde:", verdes / n)A medida que n crece, estas frecuencias suelen acercarse a las probabilidades teóricas.
Con reemplazo significa que, después de sacar una bola, la devolvemos a la urna.
Eso implica que la composición de la urna no cambia.
Por ejemplo, si saco una roja y la regreso, la urna sigue siendo la misma.
Entonces, en cada extracción:
Aquí puede salir dos veces la misma bola en color, porque después de la primera extracción la urna sigue igual.
Sin reemplazo significa que la bola que sale ya no vuelve a la urna.
Entonces la composición sí cambia.
Eso tiene una consecuencia importante:
Este detalle hace que el experimento sea distinto al caso con reemplazo.
Observa que usamos remove() para sacar de la lista la bola obtenida.
Supongamos una urna con:
Si la primera fue roja y la devolvemos, la segunda extracción sigue teniendo:
\[ P(\text{roja}) = \frac{2}{3} \]
Si la primera fue roja y no la devolvemos, queda:
Entonces ahora:
\[ P(\text{roja}) = \frac{1}{2} \]
La probabilidad cambió.
Urna inicial:
Pregunta: ¿qué pasa con la probabilidad de sacar roja en la segunda extracción?
Ese es el punto clave de la clase.
Podemos modificar la urna fácilmente.
Por ejemplo:
En urna2 hay más bolas rojas, así que esperaríamos que aparezcan más veces al simular.
import random
urna1 = ["roja", "roja", "azul", "verde"]
urna2 = ["roja", "roja", "roja", "roja", "azul", "verde"]
rojas1 = 0
rojas2 = 0
n = 1000
for i in range(n):
if random.choice(urna1) == "roja":
rojas1 += 1
if random.choice(urna2) == "roja":
rojas2 += 1
print("Frecuencia de roja en urna1:", rojas1 / n)
print("Frecuencia de roja en urna2:", rojas2 / n)No solo estamos programando.
Estamos entendiendo que:
Confundir color con posición.
En una lista, varias bolas pueden tener el mismo color:
Aunque aparezca la palabra "roja" tres veces, cada una representa una bola distinta.
Modificar la urna original sin darse cuenta.
Mira este ejemplo:
Salida:
La lista cambió. Si necesitas conservar la original, puedes hacer una copia:
Pensar que una simulación pequeña siempre refleja la probabilidad exacta.
Por ejemplo, si haces solo 10 extracciones, puede haber variación grande.
Pero si haces 1000 o 10000, normalmente los resultados se estabilizan más.
Trabajemos con esta urna:
import random
urna_original = ["roja", "roja", "roja", "azul", "azul", "verde"]
n = 1000
mismo_color_con = 0
mismo_color_sin = 0
for i in range(n):
# Con reemplazo
bola1 = random.choice(urna_original)
bola2 = random.choice(urna_original)
if bola1 == bola2:
mismo_color_con += 1
# Sin reemplazo
urna = urna_original.copy()
bola1 = random.choice(urna)
urna.remove(bola1)
bola2 = random.choice(urna)
if bola1 == bola2:
mismo_color_sin += 1
print("Prob. aproximada de mismo color con reemplazo:", mismo_color_con / n)
print("Prob. aproximada de mismo color sin reemplazo:", mismo_color_sin / n)La simulación no reemplaza al cálculo teórico, pero sí ayuda a: