Simulación del lanzamiento de una moneda

De Wiki
Saltar a: navegación, buscar

El experimento

Coin.png

Propongo la simulación del lanzamiento de una moneda para comprobar de nuevo la Ley de los Grandes Números[1]:

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.

Código Java

Versión mini

import java.util.*;
import java.lang.*;
import java.util.Random;

class Rextester
{  
  public static void main(String args[]) {
    // l: lanzamientos; m: fr. muestreo
    int l = 10000000, m = 5000;
    // f: favorables; b=0: C; b=1; X
    int f = 0, b = 0, r, n = 0; 
    double fr; // fr: frec. rel
 
    Random g = new Random();
    for(int i=0;i<(l/m);i++) {
      for(int j=0;j<m;j++) {
        r = g.nextInt(2);
        if(r == b) f++;
      }
      n+=m; fr = (double)f/n;
      System.out.println(f + "/" + n + "\t=\t" + fr);
    }
  }
}

Compila y ejecuta el código en rextester

Versión completa

import java.util.*;
import java.lang.*;
import java.util.Random;

class Rextester
{  
    public static void main(String args[])
    {
        // Definimos el experimento...
        int t = 50000; // número de lanzamientos
        int b = 1; // resultado que se anota: 0 es cara, 1 es cruz
        boolean verLanzamientos = true; // valor false si sólo se quiere ver el resultado final
        String [] caracruz = {"C","X"};
        System.out.println("Simulando " +  t + " lanzamientos de moneda...");
        System.out.print("El programa cuenta el número de '");
        System.out.println(caracruz[b] + "' que salen...");

        // nos preparamos para generar un número aleatorio...
        Random generator = new Random();
        
        // definimos un contador de lanzamientos y casos favorables
        double lanzamientos = 0;
        double favorables = 0;
        
        // empiezan los lanzamientos de moneda...
        for(int i=0;i<(t/10);i++) {
            for(int j=0;j<10;j++) {
                // lanzamos...
                int r = generator.nextInt( 2 );
                if(r == b) {
                    // si el lanzamiento es el resultado que esperábamos,
                    // lo mostramos y señalamos entre paréntesis
                    favorables++;
                    if(verLanzamientos)
                        System.out.print("(" + caracruz[r] + ") ");
                } else {
                    // si no, simplemente lo mostramos
                    if(verLanzamientos)
                        System.out.print(" " + caracruz[r] + "  ");
                }
            }
            // nuevo bloque de 10 lanzamientos...
            lanzamientos+=10;

            // mostramos la frecuencia relativa hasta el momento
            if(verLanzamientos)  {
                verLanzamiento(i,favorables,lanzamientos);
            }
            // la frecuencia relativa hasta el último lanzamiento
            // siempre se muestra
            if( i==((t/10)-1))  {
                 verLanzamiento(i,favorables,lanzamientos);
            }
        }
    }
    
    // Se muestran los detalles del lanzamiento y la frecuencia relativa
    public static void verLanzamiento(int i, double favorables, double lanzamientos) {
        // calculamos la frecuencia relativa
        double fr = favorables/lanzamientos;
        System.out.print("\t" + (int)favorables + "/" + (int)lanzamientos);
        System.out.println("\t= " + fr + "\t ");

    }
}

Lecturas

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

Referencias

  1. Artículo Ley de los grandes números en Wikipedia, la enciclopedia libre