Trocitos de código (I). Lanzando una moneda millones de veces: ¿cara o cruz?

Hace unos días explicaba cómo realizar una simulación del lanzamiento de un dado utilizando las funciones de generación de número aleatorios y de recuento de la hoja de cálculo. Los resultados del experimento permitían comprobar la Ley de los Grandes Números.

Diseñar la hoja de cálculo que simula el experimento no entraña demasiada dificultad, si uno sigue los pasos indicados en la actividad y ha utilizado fórmulas de hoja de cálculo en alguna ocasión (recomiendo echar un vistazo a las fichas sobre OpenOffice Calc que preparé hace tiempo). Sin embargo, el entorno de hoja de cálculo no siempre es el más adecuado para realizar algunos experimentos. Cualquiera que intente aumentar el número de lanzamientos de dado de la actividad, comprobará que la memoria del sistema se resiente, y es más que probable que el ordenador se «cuelgue» durante algunos segundos. Los programas de ofimática son lo que son; no les podemos pedir más.

En realidad es una excusa para introducir una nueva sección en el blog: «Trocitos de código», entradas en las que comparto algún fragmento de código (conocidos en inglés como, Code Snippets) escritos con algún lenguaje de programación y que resuelve algún problema concreto. No es mi intención (de momento) explicar ningún concepto de programación, pero si despertar la curiosidad por este arte y utilizarla como herramienta para poner a prueba y comprender mejor algunos conceptos matemáticos.

Lanzamiento de una moneda

En esta ocasión propongo la simulación del lanzamiento de una moneda para comprobar de nuevo la Ley de los Grandes Números:

«La frecuencia relativa de un suceso tiende a estabilizarse hacia una constante a medida que se repite el experimento.»

En el caso de una moneda, en cada lanzamiento la probabilidad de que salga «cara» o «cruz» es exactamente la misma (son sucesos equiprobables), de modo que para cada posible resultado la probabilidad es del 50% (0,5 para «cara» y 0,5 para «cruz»).

La probabilidad de un suceso es la constante a la que se aproxima la frecuencia relativa cuando el experimento se repite muchísimas veces.

Simulación con Java: versión «mini»

Sabemos que debemos repetir el experimento de lanzar la moneda un número «muy grande» de veces. El siguiente fragmento de código escrito en Java realiza precisamente el experimento de lanzar una moneda. Por defecto lo hace 10 millones de veces (l=10000000) y cada 5000 lanzamientos (m=5000) muestra la frecuencia relativa hasta el momento. Lógicamente, estos valores se pueden cambiar.

Para modificar el problema, bastaría con utilizar cualquier editor de «texto plano» para realizar los cambios. Y para generar el programa final y probarlo, habría que disponer de un entorno de compilación y ejecución de Java. Bien, nada de esto es necesario. Existen en Internet algunos entornos de compilación y ejecución online, que permiten probar fragmentos de código. Este es el caso de rextester, una página web en la que podemos escribir nuestro código en varios lenguajes de programación y probar su funcionamiento, además de guardarlo y compartirlo con otros usuarios.

He utilizado este entorno para que podáis probar fácilmente la versión «mini» del programa que realiza la simulación del experimento (clic sobre la imagen del código). Una vez en la web de rextester, basta con hacer clic sobre «Run it» o darle a la tecla F8.

Simulación con Java: versión completa

La versión anterior utiliza el código mínimo (o casi) para realizar la simulación. Este segundo ejemplo de código, mucho más completo y con comentarios, muestra la simulación paso a paso, con los detalles de los lanzamientos de moneda.

Una vez lanzada la simulación, observamos los resultados del experimento. En cada fila aparecen 10 lanzamientos de moneda, con una C o una X, según el resultado de «cara» o «cruz» obtenido. Cada 10 lanzamientos se calcula la frecuencia relativa del suceso «sacar cruz». En los primeros lanzamientos, observamos que el valor de frecuencia relativa ronda 0,5 pero es inestable.

Sin embargo, a medida que el número de lanzamientos crece considerablemente, comprobaremos que la frecuencia relativa se va estabilizando y aproximando de forma más exacta al valor 0,5.

Simulación con GeoGebra

Este mismo experimento se puede realizar también con GeoGebra, un software para matemáticas del que ya he hablado en Esfera TIC en más de una ocasión. La simulación del experimento de lanzar una moneda se puede repetir 10, 100 y 1000 veces.

En Tiching | Lanzando una moneda millones de veces
Código 1 | Lanzamiento de una moneda (versión mini)
Código 2 | Lanzamiento de una moneda (versión completa)
Simulación con GeoGebra | Lanzamiento de una moneda
Foto código | Ruby ruby de Elliott Cable en Flickr
Foto moneda | Lucky Six – PCA 58 de Donald Macleod

Software libre, arquitectos y pasteles

Explicar el concepto de software libre no siempre resulta sencillo. Que me disculpen los informáticos más puristas por las analogías utilizadas para explicar la idea, pero estarán de acuerdo en que, para alumnos de la ESO, es un primer paso para comprender el concepto de software libre y código abierto.

Si buscamos una definición encontramos que “el software libre se refiere a la libertad de los usuarios para ejecutar, copiar, distribuir, estudiar, modificar el software y distribuirlo modificado”.
La idea de ejecutar, copiar y distribuir un programa es fácil de comprender; lo habremos hecho más de una vez, incluso cuando no debíamos (que tire la primera piedra…). Ejecutar un programa es “abrirlo para usarlo”. Copiar un programa es leer el programa original, bit a bit, para obtener una copia digital exacta del producto. Distribuir un programa es poder entregar copias del programa a quien queramos.

Lo que quizá no está tan claro es qué es eso de poder “estudiar y modificar” el software. Para comprender esta idea, antes hay que conocer el proceso de creación de un programa, qué elementos son necesarios. Es en este punto donde hay que hablar del código fuente.

No todo el mundo conoce qué hace exactamente un programador informático. Es el profesional que en una de las fases de desarrollo del software “escribe” el programa. Así que un primer intento para explicar la idea de código fuente puede ser hablar de arquitectos y planos.

Nadie confiaría en la construcción de un edificio si los albañiles empezarán a construir el Día 1 sin haber recibido ninguna instrucción. Sería impensable levantar el edificio sin unos planos creados por un arquitecto, porque en esos diseños y otros documentos vienen registradas indicaciones detalladas sobre el proceso correcto de la obra. De hecho, el mismo arquitecto podría construir el mismo edificio en otro lugar del mundo siguiente los mismos pasos, utilizando los mismos planos.

El proceso de creación de un programa es similar. Son necesarios unos planos, que llamamos código fuente, donde están “anotadas” de forma exacta (mediante algoritmos) cada una de las instrucciones, los cálculos, cada paso del funcionamiento del programa informático.

Volvamos a la definición de software libre. Una de sus características es la libertad de cualquiera de nosotros para “estudiar y modificar” el programa. Para ser más exactos lo que se puede estudiar y modificar no es el programa, sino el código fuente del programa. ¿Qué significa esto? ¿Qué ventajas tiene?

El programa final se obtiene a partir del código fuente, cientos, miles o millones de líneas con instrucciones que detallan “qué hace el programa”. Entonces, ¿podemos cambiar su funcionamiento? Así es. Podemos cambiarlo y mejorarlo. Imaginad que pudiéramos acceder al código fuente de un juego de ordenador y que tuviéramos los conocimientos y el tiempo para modificar el código y diseñar nuestra propia versión del juego. Esto sólo es posible si es software es libre.

Y sin con arquitectos y planos todavía no queda claro el concepto, otra de las analogías utilizadas viene del mundo gastronómico, con pasteles y recetas. Ya puede uno imaginar que en este segundo intento de explicar el software libre, el pastel es el programa y la receta es el código fuente.

Sobre el tema de software libre propongo a algunos alumnos hacer una lista de la compra (de software). ¿Cuánto nos costaría equipar a un ordenador con los programas básicos para poder trabajar a diario? En general, el software libre es gratuito y, por tanto, el coste de tener un equipo con todo tipo de programas es 0 euros. Aunque hay muchos programas gratuitos en Internet (freeware), en general el software que está más generalizado entre los usuarios utiliza un sistema de licencias (de uso del programa) por las que hay que pagar una cantidad, lo que incrementa el coste final del equipo. Un ordenador no sólo vale lo que marca la etiqueta en la tienda; también hay que tener en cuenta lo que nos costará «llenarlo de programas».

Hay que buscar otras opciones. Alternativas libres.

Fotografía | Source code ON PAPER de Tim Lucas | House Plans: Side Left de Anton Raath
Enlaces | Software Libre | Código Fuente
Vídeo | Software Libre (Recetas de Cocina)