Para quem quiser testar: A chance de 'manter e ganhar' é 1/2 da chance de 'trocar e ganhar'
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
// escolha da porta com prêmio 0, 1 ou 2
np = (int) floor(3.0 * ((double) rand()) / RAND_MAX);
// escolha da porta 0, 1 ou 2
n1 = (int) floor(3 * ((double) rand()) / RAND_MAX);
// escolha do apresentador 0, 1 ou 2
do {
n2 = (int) floor(3 * ((double) rand()) / RAND_MAX);
} // porta não pode ter sido escolhida, nem ter o prêmio
while ((n2 == n1) || (n2 == np));
// ficar com a escolha inicial
if (n1 == np) ganha1++;
else perca1++;
// trocar de porta
if ((n1 != 0) && (n2 != 0)) {
// trocar para a primeira porta
if (np == 0) ganha2++;
else perca2++;
n3 = 0;
} else if ((n1 != 1) && (n2 != 1))
{ // trocar para a segunda porta
if (np == 1) ganha2++;
else perca2++;
n3 = 1;
} else
{ // trocar para a terceira porta
if (np == 2) ganha2++;
else perca2++;
n3 = 2;
}
// impressão dos resultados
// ficar e ganhar = ganha1 ficar e perder = perca1
// trocar e ganhar = ganha2 trocar e perder = perca2
printf("%d %d %d %d %d %d %d %d\n", np, n1, n2, n3, ganha1, perca1, ganha2, perca2);
}
ch = getchar(); // pausa
return 0;
}