Test Resultados - utilizando una función recursiva que simula el recuento de votos -
Número de votantes: (prueba con 2 votantes primero para ver qué resultados da)
0 COMBINACIONES GENERADAS (objetivo: 0)
Generamos con una función recursiva que simula el recuento de votos todas las combinaciones posibles. |
Una vez generadas todas las combinaciones, contamos cuántos SI y cuántos NO hay en cada una. | ||
RESULTADO | CAMINOS | PROBABILIDAD |
Método
Hace poco surgió una controversia sobre la probabilidad del resultado en una votación SI/NO de la @cupnacional, en la que resultó un empate de 1515 votos a favor y 1515 votos en contra. A priori, el sentido común inmediato nos dice que es una opción muy poco probable. La verdad es que me picó la curiosidad, y como no recuerdo la estadística que estudié en su día, busqué el resultado "a lo bruto" imaginando el escrutinio, sacando papeleta a papeleta (SI, NO) y teniendo en cuenta lo giguiente:
- Cada voto es 'independiente', es decir, el voto de 'Javier' no influye en el de 'Maria',
- Una vez relizada la votación, teniendo todas las papeletas en la mesa de recuento, el orden del recuento no modifica el resultado,
- Dado lo anterior, la probabilidad de un resultado es la suma de la probabilidad de todos los caminos (formas de hacer el recuento) posibles a ese resultado.
El objetivo entonces es obtener la lista de caminos posibles (combinaciones) y para cada combinación contar cuántos SI y cuántos NO hay. En este caso, y aquí viene lo de "a lo bruto", con una función recursiva:
Nota para coders:
He tenido que convertir la función recursiva a iterativa, ya que los browsers sólo soportan N llamadas recursivas. Aún así, dado que existen 2^num-votantes combinaciones para encontrar el resultado, el recuento de votos es muy lento y queda pendiente optimizar o cambiar de estrategía ;). Comentar también que para no bloquear el UI, he utilizado https://github.com/Katochimoto/setImmediate.
Referencias Relacionadas (Estadística)
Algunas referencias sobre el caso de la votación de la CUP y la controversia generada:
var voto = function (combinacion) {Para iniciar el recuento (generación de todas las combinaciones posibles) llamámos a la función recursiva con las 2 únicas opciones para la primera papeleta: voto("S") y voto("N"). La función recursiva no se detendrá hasta generar todas las formas de recuento posible.
if (combinacion.length != numVotantes) { // si todavía no hemos contado todos los votos, la siguiente papeleta puede ser un SI o un NO ;)
voto(combinacion + "S"); // la siguiente papeleta es un SI
voto(combinacion + "N"); // la siguiente papeleta es un NO
} else { // Si ya hemos contado todos los votos, hacemos el recuento para esta combinación.
var SIs = (combinacion.match(/S/g) || []).length; // cuantos SIs
var NOs = (combinacion.match(/N/g) || []).length; // cuantos NOs
almacenarResultado(SIs,NOs); // sumamos +1 al resultado SIs/NOs de esta combinación (recuento)
return;
}
};
Nota para coders:
He tenido que convertir la función recursiva a iterativa, ya que los browsers sólo soportan N llamadas recursivas. Aún así, dado que existen 2^num-votantes combinaciones para encontrar el resultado, el recuento de votos es muy lento y queda pendiente optimizar o cambiar de estrategía ;). Comentar también que para no bloquear el UI, he utilizado https://github.com/Katochimoto/setImmediate.
Referencias Relacionadas (Estadística)
Algunas referencias sobre el caso de la votación de la CUP y la controversia generada:
- Així es va fer el recompte a l'assemblea de la CUP
- Quina probabilitat hi havia que l'assemblea de la CUP acabés en empat?
- La teoria de la probabilitat i l’Assemblea de la CUP
- Quines probabilitats hi havia que es produís un empat a l'assemblea de la CUP?
- UN ENGINYER, UN MATEMÀTIC, UN PSICÒLEG I UN CATALÀ DISCUTINT LA PROBABILITAT QUE L’ASSEMBLEA DE LA CUP HAGI ACABAT EN EMPAT
Bueno, ya me he desquitado.