Key words: Simulacion de ruleta, estadística básica, probabilidad y frecuencias, simulación básica, python para adolescentes, matemáticas de secundaria DOI: 10.6084/m9.figshare.8194709 CC By 4.0
Script para simular las vueltas de una ruleta. La idea es simular el proceso en el que una ruleta da nVueltas, en cada vuelta, la bolita de una ruleta toca alguna celda. Después de algunas vueltas (en total un número aleatorio) la ruleta termina y se define el resultado final en una pareja compuesta por un número y un color (e.g. (3,negro)). Los números mínimo y máximo de vueltas se pueden definir cambiando las variables iniciales, así como otros parámetros de la simulación.
La primera parte de este documento muestra como construir la simulación de la ruleta. La seguna parte sintetiza la información presentada al principio construyendo funciones que permiten simular varios juegos de ruleta. Con los datos de la simulación de los juegos, se calculan estadísticas básicas y se hacen algunas comparaciones con predicciones teóricas obtenidos a partir de la construcción inicial del modelo.
Importa módulos básicos para hacer cálculos y gráficas
# Importamos modulos
import scipy as sc
import pylab as gr
import scipy.stats as stats
%matplotlib inline
randint=sc.random.randint
Crea variables para los números y los colores de la ruleta, el número de vueltas, y el número de colores
nNumeros = 36 # Numero de posibilidades numéricas de la ruleta
colores = ['rojo', "negro"] # Colores de la ruleta
nColores = len(colores) # Número de colores en la ruleta
nVueltas = randint(23,51) # Número de vueltas de ruleta
print('La ruleta dará %d vueltas para seleccionar 1 de %d números y 1 de %d colores'%(nVueltas,nNumeros,nColores))
Ciclo básico de ruleta:
Selecciona un número y un color que corresponda al número suponiendo que los impares son negros, y los pares, rojos. Esta selección corresponde al evento en el que la bolita de la ruleta toca una celda mientras la ruleta da vuelta.
n = randint(1,nNumeros) # representa celda de la ruleta en donde toca la bola mientras la ruleta da vueltas
if n%2==0: # Si el número es par, asigna el color de los pares usando la lista de colores
c= colores[0]
else: # Si el número no es par, asigna el color de los impares usando la lista de colores
c= colores[1]
print('n=%d, c=%s'%(n,c)) # Reporta el resultado (toque de bola en la celda de la ruleta durante el giro)
Ahora si, ciclo para hacer vueltas de ruleta hasta terminar. El último par de número y color es reportado como resultado final.
# Vueltas de ruleta: Iteración de los toques de bola
nVueltas = randint(7,19); print('Ruleta girando %d vueltas'%nVueltas)
# Ciclo analogo a los giros de la ruleta.
# Se supone que los toques de la bola en la ruleta representan un ciclo en el que se selecciona una celda de la ruleta.
for v in range(nVueltas): # Giros de la ruleta
n = randint(1,nNumeros+1) # Selección de un número aleatorio que representa la celda tocada por la bola
if n%2==0: # Si el número es par, asigna el color de los pares usando la lista de colores
c= colores[0]
else: # Si el número no es par, asigna el color de los impares usando la lista de colores
c= colores[1]
print('vuelta %d: (%d,%s)'%(v+1, n,c)) # Reporta el resultado en cada vuelta
print('El resultado es (%d,%s)'%(n,c)) # Reporta el resultado final
La idea es darle vuelta a la ruleta (celda anterior) varias veces. Para eso, ponemos los ciclos de la ruleta en un "loop" que de entre 7 y 31 vueltas. Guardamos los resultados para analizarlos y hacer histogramas.
Es posible hacer que sea más limpio y organizado el script escribiendo funciones para el ciclo básico de la vuelta de ruleta y las vueltas de la ruleta.
def toqueBolaRuleta(nNumeros=36, colores=['rojo','negro'],verVueltas=0):
n = randint(1,nNumeros+1) # representa celda de la ruleta en donde toca la bola mientras la ruleta da vueltas
if n%2==0:
c= colores[0]
else:
c= colores[1]
if verVueltas==1:
print('n=%d, c=%s'%(n,c))
return n,c
def vueltasRuleta(minVueltas=7,maxVueltas=31,nNumeros=36, colores=['rojo','negro'],verVueltas=0):
nVueltas = randint(minVueltas,maxVueltas)
print('Ruleta girando %d vueltas'%nVueltas)
for v in range(nVueltas):
n,c= toqueBolaRuleta(nNumeros, colores,verVueltas)
print('(%d,%s)'%(n,c))
return n,c
vueltasRuleta(minVueltas=7,maxVueltas=31,nNumeros=3, colores=['rojo','negro'],verVueltas=1)
Ahora queremos jugar a la ruleta y hacer estadísticas de los resultados Jugaremos 100 veces a la ruleta, y analizaremos los resultados. Se supone que cada número tiene la misma chance de ocurrir, y también los colores. La probabilidad de que ocurra un número n al dar vuelta a la ruleta es 1/36. Como hay 18 números negros (impares) y 18 números rojos (pares), entonces la probabilidad de que caiga rojo es igual a la de negro, que es 1/2.
Ahora veamos si esto ocurre con la ruleta que hicimos...
La función vueltasRuleta se puede correr varias veces para generar una muestra de resultados al jugar la ruleta.
juegos=100; maxNum=6 # Ruleta con números 1,2,3,4,5,6
num=list(); color=list() # Listas para guardar los resultados
# Ciclo para correr la ruleta varias veces
for j in range(juegos):
n,c= vueltasRuleta(minVueltas=7,maxVueltas=31,nNumeros=maxNum, colores=['rojo','negro'],verVueltas=0)
num.append(n); color.append(c) # Guarda los resultados de cada vuelta en la lista correspondiente
num = sc.array(num)
# Reportes de resultados
print(num)
print(color)
print('Promedio',num.mean())
bins=gr.arange(1,maxNum+2); print(bins)
gr.figure()
#histograma para los números
h1= gr.hist(num,bins,align='left')
gr.plot([0.5,6.5],[100.0/maxNum,100.0/maxNum],'k')
gr.text(5.5,17.5,r'%d/%d'%(juegos,maxNum),fontsize=12)
gr.ylabel('Frecuencias')
frecuencias = h1[0]
frecRelativas = h1[0]/juegos
print('Frecuencias de numeros',frecuencias)
print('Frecuencias relativas de numeros',frecRelativas)
Las frecuencias relativas son cercanas a 1/6, pero todas diferentes. Esto tiene sentido porque la probabilidad de ocurrencia de cada uno de los números es 1/6.
#Teniendo cuidado con los índices
indiceModa = 1+frecuencias.argmax()
print('La moda es %d'% (indiceModa))
Ordenamos la muestra con los numeros y usamos las frecuencias para encontrar la mediana. Como hay 100 números, queremos el promedio de los números que aparecen en los lugares 49 y el 50 de la lista ordenada.
print('Lista original',num)
listaOrdenada = sc.sort(num);
print('Lista ordenada',listaOrdenada)
print('Hay %d unos, %d dos, %d tres'%(frecuencias[0],frecuencias[1],frecuencias[2]))
print('Hay %d cuatros, %d cincos, y %d seises'%(frecuencias[3],frecuencias[4],frecuencias[5]))
Entonces la mediana es 3 porque los números 49 y 50 en la lista, son ambos tres.
Viendo solo los numeros 49 y 50 en la lista ordenada (en python son los de índice 48 y 49 porque los índices comienzan en 0), vemos que el promedio de los dos números que son 4 es entoces 4.
print('La mediana es el promedio de ', listaOrdenada[48:50])
print('La mediana es entonces %g'%(listaOrdenada[48:50].mean()))
bins=gr.arange(1,2); print(bins)
gr.figure(figsize=(11,5))
h2= gr.hist(color,2) # histograma para los colores
gr.plot([0,1],[juegos/2.0,juegos/2.0],'k') # predicciones teoricas
gr.text(0.75,52,r'%d/%d'%(juegos,2),fontsize=12)
frecColores= h2[0]
frecRelColores=h2[0]/100
print('Frecuencias de colores',frecColores)
print('Frecuencias relativas de los colores',frecRelColores)
Las frecuencias de los colores son muy parecidas para rojos y negros. Entonces las frecuencias relativas son cercanas a 1/2. Tiene sentido porque la probabilidad de obtener cualquiera de los colores es 1/2.
# Pie chart, where the slices will be ordered and plotted counter-clockwise:
ff= gr.figure(figsize=(11,11))
labels1 = sc.arange(1,7);
explode1 = sc.zeros(len(labels1)); explode1[indiceModa-1]=0.1;
explode2= [0,0]; explode2[frecColores.argmax()]=0.1
ax1=ff.add_subplot(1,2,1)
ax2=ff.add_subplot(1,2,2)
ax1.pie(frecRelativas, explode= explode1, labels=labels1, autopct='%1.1f%%')
ax1.axis('equal') # Equal aspect ratio ensures that pie is drawn as a circle.
ax2.pie(frecRelColores, explode=explode2, labels=colores, autopct='%1.1f%%', colors = ['red','black'])
ax2.axis('equal') # Equal aspect ratio ensures that pie is drawn as a circle.