Matlab

Calculadora de probabilidades de ganar a la lotería

En una entrada anterior explique como se pueden calcular las posibilidades de ganar en el juego de los Euromillones y en otra la Bonoloto o Lotería Primitiva. Un juego de azar popular en algunos países europeos. Para ello primero se explicó cómo calcular el número total de combinaciones que existen en el juego y la posibilidad de conseguir una cantidad de aciertos de la combinación ganadora. Aplicando el proceso de cálculo solamente a Euromillones. Para obtener la probabilidad de ganar a otro juego, con diferente número reglas, en esta entrada vamos a crear una calculadora de probabilidades de ganar a la lotería en Matlab.

Actualización: Esta herramienta ya se puede utilizar directamente en línea a través del laboratorio de Analytics Lane. Accede a la versión web para calcular tus probabilidades de ganar en distintos juegos de azar.

Implementación del proceso de cálculo

La semana pasada se mostró cómo calcular el número de combinaciones que existe en un juego de azar donde se selecciona k bolas de un conjunto de n. Para lo que es necesario usar el coeficiente binomial. El cual se encuentra disponible en Matlab mediante la función nchoosek. Así el número de combinaciones totales se puede calcular usando la expresión

nchoosek(numeros_1, aciertos_1) * nchoosek(numeros_2, aciertos_2)

donde numeros_1 son los números del primer conjunto, aciertos_1 son los números que se extraen de primer conjunto, numeros_2 son los números de segundo conjunto y aciertos_2 son los números que se extraen de segundo conjunto.

Por otro lado, las combinaciones con una cantidad dada de fallos en el primer y segundo conjunto se pueden obtener con la siguiente expresión:

nchoosek(aciertos_1, aciertos_1 - fallos_1) * ...
nchoosek(numeros_1 - aciertos_1, fallos_1) * ...
nchoosek(aciertos_2, aciertos_2 - fallos_2) * ...
nchoosek(numeros_2 - aciertos_2, fallos_2)

donde fallos_1 son los fallos en primer conjunto y fallos_1 en el segundo.

Creación de una aplicación

Con esto se puede crear una aplicación gráfica en Matlab, para lo que se puede escribir el siguiente código.

function h = loteria_()

% Posción del monitor
monitor = get(0, 'MonitorPositions');
position_h = monitor(3) / 2 - 536 / 2;
position_w = monitor(4) / 2 - 536 / 2;

% Figura base
h = uifigure('Name', 'Calculadora probabilidades lotería', ... 
    'Resize', 'Off', ...
    'Position', [position_h, position_w, 536, 482]);

% Objetos
uilabel(h, ...
    'Position', [41, 438, 124, 22], ...
    'Text', 'Combinación primaria');
combinacinPrimaria = uieditfield(h, 'numeric', ...
    'Position', [180, 438, 100, 22], ...
    'Value', 50);
uilabel(h, ...
    'Position', [315, 438, 96, 22], ...
    'Text', 'Aciertos primaria');
aciertosPrimaria = uieditfield(h, 'numeric', ...
    'Position', [426, 438, 100, 22], ...
    'Value', 5);

uilabel(h, ...
    'Position', [26, 406, 139, 22], ...
    'Text', 'Combinación secundaria');
combinacinSecundaria = uieditfield(h, 'numeric', ...
    'Position', [180, 406, 100, 22], ...
    'Value', 12);
uilabel(h, ...
    'Position', [299, 406, 112, 22], ...
    'Text', 'Aciertos secundaria');
aciertosSecundaria = uieditfield(h, 'numeric', ...
    'Position', [426, 406, 100, 22], ...
    'Value', 5);

uilabel(h, ...
    'Position', [15, 373, 150, 22], ...
    'Text', 'Número de combinaciones');
numeroCombinaciones = uieditfield(h, 'numeric', ...
    'Editable', 'Off', ...
    'Enable', 'Off', ...
    'Position', [180, 373, 100, 22]);

uibutton(h, ...
    'Position', [427, 373, 100, 22], ...
    'ButtonPushedFcn', @calcular, ...
    'Text', 'Calcular');

resultsTable = uitable(h, 'Position', [11, 10, 515, 339]);

    function calcular(~, ~)        
        resutls = zeros(((aciertosPrimaria.Value + 1) * ...
            (aciertosSecundaria.Value + 1)), 4);
        combinaciones = nchoosek(combinacinPrimaria.Value,  aciertosPrimaria.Value) * ...
            nchoosek(combinacinSecundaria.Value, aciertosSecundaria.Value);
        
        for fallos_1 = 0:aciertosPrimaria.Value
            for fallos_2 = 0:aciertosSecundaria.Value
                row = fallos_1 * (aciertosSecundaria.Value + 1) + fallos_2 + 1;
                resutls(row, 1) =  aciertosPrimaria.Value - fallos_1;
                resutls(row, 2) =  aciertosSecundaria.Value - fallos_2;
                resutls(row, 3) =  ...
                    nchoosek(aciertosPrimaria.Value, aciertosPrimaria.Value - fallos_1) * ...
                    nchoosek(combinacinPrimaria.Value - aciertosPrimaria.Value, fallos_1) * ...
                    nchoosek(aciertosSecundaria.Value, aciertosSecundaria.Value - fallos_2) * ...
                    nchoosek(combinacinSecundaria.Value - aciertosSecundaria.Value, fallos_2);
                resutls(row, 4) = 100 * resutls(row, 3) / combinaciones;
            end
        end
        
        numeroCombinaciones.Value = combinaciones;
        resultsTable.ColumnName = {'Aciertos 1', 'Aciertos 2', 'Combinaciones', 'Probabilidad (%)'};
        resultsTable.Data = resutls;
    end
end

La cual una vez lanzada tiene la siguiente forma:

Calculadora de probabilidades de ganar a la lotería

Al pulsar el botón calcular se pueden obtener los resultados para el juego.

Calculadora de probabilidades de ganar a la lotería con los resultados para el juego de Euromillones

Conclusiones

En esta entrada se ha creado una calculadora de probabilidades de ganar a la lotería en Matlab. Así podemos comprobar lo poco probable que es ganar a uno de estos juegos. Y lo fácil que es no acertar ningún número, aunque intuitivamente pueda parecer lo contrario.

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez

Recent Posts

Migrar tslane a un paquete dual CommonJS y ESM con tsup y Vitest

tslane es la plantilla que uso como punto de partida para mis librerías TypeScript, nacida…

2 días ago

Cómo construir tu primer scorecard paso a paso

En los artículos anteriores de esta serie vimos la teoría detrás del credit scoring: qué…

4 días ago

Actualizar expresslanets a ES Modules con tsx y Vitest

expresslanets es la plantilla de API REST con Express y TypeScript que empezó como una…

1 semana ago

Pareto/NBD: cuando el abandono silencioso cambia el CLV

En el artículo del Dashboard vimos que Pareto/NBD aparecía junto a BG/NBD con un ajuste…

2 semanas ago

Por qué migrar tus proyectos TypeScript a ES Modules en 2026

Durante años, CommonJS (require/module.exports) ha sido la forma por defecto de organizar módulos en Node.js,…

2 semanas ago

Método del codo: interpretación correcta y limitaciones

Cuando usas k-means tienes que decidir algo incómodo de entrada: cuántos grupos, , vas a…

3 semanas ago

This website uses cookies.