Aprende programación






5 nov. 2010

Ley de Registro Civil, el hijo tendrá los apellidos de los padres ordenados alfabéticamente - Experimento práctico

Introducción:
Recientemente se ha publicado una noticia acerca de una modificación que se está fraguando en España en la Ley de Registro Civil en el que para igualar el hombre a la mujer el nombre de los apellidos se pondrán de manera ordenada alfabéticamente (en caso de no ponerse de acuerdo).
http://www.diariovasco.com/20101104/mas-actualidad/sociedad/apellidos-alfabetico-201011041307.html
http://www.meneame.net/story/llamazares-avisa-variable-alfabeto-puede-traer-consecuencias/1

Sin embargo, es curioso que ciertos políticos que han redactado la ley no se hayan dado cuenta de que a medida que pasen generaciones la probabilidad de tener los mismos apellidos será muy alta en el caso de aplicarse con habitualidad. Por ello, me ha parecido interesante realizar un algoritmo para comprobar a que velocidad, (en generaciones), perderiamos los apellidos que tenemos.

El algoritmo:
Aquí teneis el algoritmo. Es algo muy sencillo. Hay dos constantes para configurar el número de personas de muestra y el número de apellidos. Los apellidos vamos a tratarlos como enteros para generarlos aleatoriamente más facilmente. En cada generación, cada pareja genera dos nuevas personas y estas fallecen. Se guarda en una matriz cuantos apellidos tanto en el primer apellido como en el segundo hay de cada. Finalmente se visualiza el resultado en csv para poder hacer gráficas a través de un Excel:

import java.util.ArrayList;

public class Apellidos {

public static int PERSONAS_POR_GENERACION=1000;
public static int TOTAL_APELLIDOS=300;

private int ape1;
private int ape2;

public Apellidos(int ape1, int ape2){
this.ape1=ape1;
this.ape2=ape2;
}

public static void main(String arg[]){
int contApellidos[][]=new int[20][TOTAL_APELLIDOS];
ArrayList<Apellidos> personas=new ArrayList<Apellidos>();
//Se insertan apellidos aleatorios
for (int n=0;n<PERSONAS_POR_GENERACION;n++){
int nApe1=(int)(Math.random()*TOTAL_APELLIDOS);
int nApe2=(int)(Math.random()*TOTAL_APELLIDOS);
Apellidos nuevo=new Apellidos(nApe1, nApe2);
personas.add(nuevo);
}
//Cada pareja tienen dos hijos y cuando muere una generación (1000 personas)
for (int n=0;n<20;n++){
for (int m=0;m<PERSONAS_POR_GENERACION;m+=2){
Apellidos hombre=personas.get(m);
Apellidos mujer=personas.get(m+1);
for (int i=0;i<2;i++){
personas.add((int)(Math.random()*(personas.size()-1000))+1000,
new Apellidos(
Math.min(hombre.ape1, mujer.ape1),
Math.max(hombre.ape1, mujer.ape1)
)
);
}
//Contamos los apellidos de la gente que va a fallecer para así ver la linealidad de la generación inicial
contApellidos[n][hombre.ape1]++;
contApellidos[n][mujer.ape1]++;
}
for (int m=0;m<PERSONAS_POR_GENERACION;m++){
personas.remove(0);
}
}
//Visualización de la cantidad de apellidos para cada generacion
for (int m=0;m<TOTAL_APELLIDOS;m++){
for (int n=0;n<20;n++){
System.out.print(contApellidos[n][m] + ";");
}
System.out.println();
}
}
}


Resultados:
En la primera generación, claramente tendríamos todos los apellidos:


En la segunda generación se empizan a ver las primeras consecuencias en los últimos apellidos:


En la generación tercera:



En la generación cuarta:


Finalmente en la simulación, en la generación 12 ya eran todos los apellidos eran iguales y sigue una progresión de valor(generacion)=valor(generacion-1)*2 hasta que llega al 50% que va bajando el ritmo de crecimiento ya que se empiezan a juntar parejas con el mismo apellido. Ver gráfica:


Conclusión:
La desaparición de los apellidos se concentrarían en uno único de manera que en varias generaciones todos tendríamos el mismo apellido.

Conclusión 2:
Harían falta más matemáticos y estadísticos y personas de ciencias exactas ejerciendo como políticos. ;)

ACTUALIZACION: Dado el feedback recibido, aclarar que la ley tal y como define el primer link que pongo, se aplica en caso de discusión. Este sería el caso en el que se aplica de manera habitual. He modificado la noticia para aclarar este hecho.

No hay comentarios:

Publicar un comentario