Simulación de Juego de Ruleta

Emilio Arieli Herrera-McKiernan$^{1}$, Marco Arieli Herrera-Valdez$^{2}$

$^{1}$Escuela Secundaria Diurna 35, Vicente Guerrero, SEP, Mexico, $^{2}$Facultad de Ciencias, UNAM, México

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

In [1]:
# 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

In [2]:
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))
La ruleta dará 31 vueltas para seleccionar 1 de 36 números y 1 de 2 colores

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.

In [3]:
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)
n=14, c=rojo

Ahora si, ciclo para hacer vueltas de ruleta hasta terminar. El último par de número y color es reportado como resultado final.

In [4]:
# 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
Ruleta girando 8 vueltas
vuelta 1: (5,negro)
vuelta 2: (5,negro)
vuelta 3: (24,rojo)
vuelta 4: (3,negro)
vuelta 5: (36,rojo)
vuelta 6: (13,negro)
vuelta 7: (27,negro)
vuelta 8: (3,negro)
El resultado es (3,negro)

-------------------------------------------

Version mas organizada del script para darle vuelta a la ruleta varias veces

-------------------------------------------

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.

In [5]:
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
In [6]:
vueltasRuleta(minVueltas=7,maxVueltas=31,nNumeros=3, colores=['rojo','negro'],verVueltas=1)
Ruleta girando 29 vueltas
n=1, c=negro
n=3, c=negro
n=3, c=negro
n=2, c=rojo
n=1, c=negro
n=3, c=negro
n=1, c=negro
n=1, c=negro
n=3, c=negro
n=2, c=rojo
n=3, c=negro
n=3, c=negro
n=1, c=negro
n=2, c=rojo
n=1, c=negro
n=2, c=rojo
n=1, c=negro
n=1, c=negro
n=1, c=negro
n=1, c=negro
n=1, c=negro
n=1, c=negro
n=2, c=rojo
n=3, c=negro
n=1, c=negro
n=1, c=negro
n=1, c=negro
n=1, c=negro
n=2, c=rojo
(2,rojo)
Out[6]:
(2, 'rojo')

Estadísticas sobre las vueltas de ruleta con números del 1 al 6 y colores rojo y negro

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.

In [7]:
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)
Ruleta girando 9 vueltas
(2,rojo)
Ruleta girando 17 vueltas
(5,negro)
Ruleta girando 13 vueltas
(3,negro)
Ruleta girando 30 vueltas
(2,rojo)
Ruleta girando 28 vueltas
(4,rojo)
Ruleta girando 29 vueltas
(3,negro)
Ruleta girando 22 vueltas
(4,rojo)
Ruleta girando 10 vueltas
(6,rojo)
Ruleta girando 19 vueltas
(1,negro)
Ruleta girando 25 vueltas
(5,negro)
Ruleta girando 25 vueltas
(4,rojo)
Ruleta girando 28 vueltas
(1,negro)
Ruleta girando 18 vueltas
(5,negro)
Ruleta girando 28 vueltas
(1,negro)
Ruleta girando 15 vueltas
(4,rojo)
Ruleta girando 17 vueltas
(2,rojo)
Ruleta girando 21 vueltas
(4,rojo)
Ruleta girando 11 vueltas
(3,negro)
Ruleta girando 27 vueltas
(6,rojo)
Ruleta girando 16 vueltas
(6,rojo)
Ruleta girando 30 vueltas
(4,rojo)
Ruleta girando 21 vueltas
(6,rojo)
Ruleta girando 29 vueltas
(4,rojo)
Ruleta girando 25 vueltas
(1,negro)
Ruleta girando 8 vueltas
(4,rojo)
Ruleta girando 13 vueltas
(5,negro)
Ruleta girando 11 vueltas
(4,rojo)
Ruleta girando 14 vueltas
(3,negro)
Ruleta girando 30 vueltas
(6,rojo)
Ruleta girando 9 vueltas
(4,rojo)
Ruleta girando 30 vueltas
(4,rojo)
Ruleta girando 30 vueltas
(6,rojo)
Ruleta girando 24 vueltas
(3,negro)
Ruleta girando 13 vueltas
(5,negro)
Ruleta girando 20 vueltas
(2,rojo)
Ruleta girando 16 vueltas
(2,rojo)
Ruleta girando 7 vueltas
(3,negro)
Ruleta girando 23 vueltas
(4,rojo)
Ruleta girando 19 vueltas
(5,negro)
Ruleta girando 21 vueltas
(5,negro)
Ruleta girando 10 vueltas
(1,negro)
Ruleta girando 10 vueltas
(2,rojo)
Ruleta girando 14 vueltas
(2,rojo)
Ruleta girando 8 vueltas
(6,rojo)
Ruleta girando 18 vueltas
(4,rojo)
Ruleta girando 24 vueltas
(1,negro)
Ruleta girando 12 vueltas
(3,negro)
Ruleta girando 13 vueltas
(2,rojo)
Ruleta girando 10 vueltas
(5,negro)
Ruleta girando 30 vueltas
(4,rojo)
Ruleta girando 30 vueltas
(5,negro)
Ruleta girando 20 vueltas
(2,rojo)
Ruleta girando 14 vueltas
(3,negro)
Ruleta girando 14 vueltas
(6,rojo)
Ruleta girando 24 vueltas
(1,negro)
Ruleta girando 17 vueltas
(6,rojo)
Ruleta girando 19 vueltas
(2,rojo)
Ruleta girando 14 vueltas
(3,negro)
Ruleta girando 21 vueltas
(4,rojo)
Ruleta girando 9 vueltas
(1,negro)
Ruleta girando 19 vueltas
(2,rojo)
Ruleta girando 19 vueltas
(1,negro)
Ruleta girando 7 vueltas
(2,rojo)
Ruleta girando 22 vueltas
(5,negro)
Ruleta girando 11 vueltas
(4,rojo)
Ruleta girando 29 vueltas
(2,rojo)
Ruleta girando 25 vueltas
(2,rojo)
Ruleta girando 29 vueltas
(3,negro)
Ruleta girando 26 vueltas
(1,negro)
Ruleta girando 22 vueltas
(6,rojo)
Ruleta girando 22 vueltas
(3,negro)
Ruleta girando 22 vueltas
(6,rojo)
Ruleta girando 7 vueltas
(5,negro)
Ruleta girando 23 vueltas
(2,rojo)
Ruleta girando 19 vueltas
(1,negro)
Ruleta girando 18 vueltas
(3,negro)
Ruleta girando 19 vueltas
(3,negro)
Ruleta girando 26 vueltas
(3,negro)
Ruleta girando 24 vueltas
(4,rojo)
Ruleta girando 25 vueltas
(2,rojo)
Ruleta girando 11 vueltas
(1,negro)
Ruleta girando 30 vueltas
(2,rojo)
Ruleta girando 29 vueltas
(3,negro)
Ruleta girando 30 vueltas
(4,rojo)
Ruleta girando 23 vueltas
(3,negro)
Ruleta girando 29 vueltas
(1,negro)
Ruleta girando 30 vueltas
(3,negro)
Ruleta girando 10 vueltas
(2,rojo)
Ruleta girando 20 vueltas
(1,negro)
Ruleta girando 29 vueltas
(5,negro)
Ruleta girando 18 vueltas
(2,rojo)
Ruleta girando 22 vueltas
(2,rojo)
Ruleta girando 11 vueltas
(5,negro)
Ruleta girando 12 vueltas
(6,rojo)
Ruleta girando 28 vueltas
(2,rojo)
Ruleta girando 26 vueltas
(3,negro)
Ruleta girando 9 vueltas
(5,negro)
Ruleta girando 13 vueltas
(1,negro)
Ruleta girando 26 vueltas
(4,rojo)
Ruleta girando 11 vueltas
(6,rojo)
[2 5 3 2 4 3 4 6 1 5 4 1 5 1 4 2 4 3 6 6 4 6 4 1 4 5 4 3 6 4 4 6 3 5 2 2 3
 4 5 5 1 2 2 6 4 1 3 2 5 4 5 2 3 6 1 6 2 3 4 1 2 1 2 5 4 2 2 3 1 6 3 6 5 2
 1 3 3 3 4 2 1 2 3 4 3 1 3 2 1 5 2 2 5 6 2 3 5 1 4 6]
['rojo', 'negro', 'negro', 'rojo', 'rojo', 'negro', 'rojo', 'rojo', 'negro', 'negro', 'rojo', 'negro', 'negro', 'negro', 'rojo', 'rojo', 'rojo', 'negro', 'rojo', 'rojo', 'rojo', 'rojo', 'rojo', 'negro', 'rojo', 'negro', 'rojo', 'negro', 'rojo', 'rojo', 'rojo', 'rojo', 'negro', 'negro', 'rojo', 'rojo', 'negro', 'rojo', 'negro', 'negro', 'negro', 'rojo', 'rojo', 'rojo', 'rojo', 'negro', 'negro', 'rojo', 'negro', 'rojo', 'negro', 'rojo', 'negro', 'rojo', 'negro', 'rojo', 'rojo', 'negro', 'rojo', 'negro', 'rojo', 'negro', 'rojo', 'negro', 'rojo', 'rojo', 'rojo', 'negro', 'negro', 'rojo', 'negro', 'rojo', 'negro', 'rojo', 'negro', 'negro', 'negro', 'negro', 'rojo', 'rojo', 'negro', 'rojo', 'negro', 'rojo', 'negro', 'negro', 'negro', 'rojo', 'negro', 'negro', 'rojo', 'rojo', 'negro', 'rojo', 'rojo', 'negro', 'negro', 'negro', 'rojo', 'rojo']
In [8]:
print('Promedio',num.mean())
('Promedio', 3.35)

Frecuencias absolutas y relativas, y moda

In [27]:
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
[1 2 3 4 5 6 7]
In [10]:
print('Frecuencias de numeros',frecuencias)
print('Frecuencias relativas de numeros',frecRelativas)
('Frecuencias de numeros', array([15., 21., 18., 19., 14., 13.]))
('Frecuencias relativas de numeros', array([0.15, 0.21, 0.18, 0.19, 0.14, 0.13]))

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.

In [11]:
#Teniendo cuidado con los índices
indiceModa = 1+frecuencias.argmax()
print('La moda es %d'% (indiceModa))
La moda es 2

Calculo de la mediana

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.

In [12]:
print('Lista original',num)
listaOrdenada = sc.sort(num);
print('Lista ordenada',listaOrdenada)
('Lista original', array([2, 5, 3, 2, 4, 3, 4, 6, 1, 5, 4, 1, 5, 1, 4, 2, 4, 3, 6, 6, 4, 6,
       4, 1, 4, 5, 4, 3, 6, 4, 4, 6, 3, 5, 2, 2, 3, 4, 5, 5, 1, 2, 2, 6,
       4, 1, 3, 2, 5, 4, 5, 2, 3, 6, 1, 6, 2, 3, 4, 1, 2, 1, 2, 5, 4, 2,
       2, 3, 1, 6, 3, 6, 5, 2, 1, 3, 3, 3, 4, 2, 1, 2, 3, 4, 3, 1, 3, 2,
       1, 5, 2, 2, 5, 6, 2, 3, 5, 1, 4, 6]))
('Lista ordenada', array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
       3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
       4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6,
       6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6]))
In [13]:
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]))
Hay 15 unos, 21 dos, 18 tres
Hay 19 cuatros, 14 cincos, y 13 seises

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.

In [14]:
print('La mediana es el promedio de ', listaOrdenada[48:50])
print('La mediana es entonces %g'%(listaOrdenada[48:50].mean()))
('La mediana es el promedio de ', array([3, 3]))
La mediana es entonces 3

Estadísticas de colores

In [37]:
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)
[1]
Out[37]:
Text(0.75,52,'100/2')
In [16]:
frecColores= h2[0]
frecRelColores=h2[0]/100
print('Frecuencias de colores',frecColores)
print('Frecuencias relativas de los colores',frecRelColores)
('Frecuencias de colores', array([53., 47.]))
('Frecuencias relativas de los colores', array([0.53, 0.47]))

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.

Representación de frecuencias en diagrama de pie

In [17]:
# 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.
Out[17]:
(-1.1186809900260477,
 1.1008895709536028,
 -1.1253409968345418,
 1.214583175690986)