Quien no ha visto ese concurso donde hay un solo premio detras de 3 puertas las otras 2 con Cabras u Ovejas...
La opción adecuada es siempre "cambiar" de puerta cuando te pregunten si te quieres cambiar de la misma..
El programa simula 10 Millones de Juegos 2 veces, en la primera ronda el jugador siempre cambia de puerta y en la segunda ronda el jugador nunca cambia de puerta.
Se demuestra que se tiene 66.6% de probabilidad de ganar si se cambia de puerta, contra 33.3% de probabilidad de ganar si no se cambia de puerta.
Código
#include<stdio.h>
#include<stdint.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#define GOAT 0 //CABRA 0
#define PRIZE 1 //PREMIO 1
#define MAX_SIMULATIONS 10000000
int main(){
/*unsigned char */
uint8_t position =0;//Posicion del premio
uint8_t selected =0;//Posicion seleccionada por el jugado
uint8_t doors[3];//Puertas
uint8_t can_switch =0;//La puerta a la cual se puede cambiar
La memoria no se inicializa en 0 de forma automatica. Los arreglos no se inicializan en 0 de forma automatica. Las variables no se inicializan en 0 de forma automatica.
Se que es un tema tanto repetitivo y es el causante de muchos errores de programacion.
No existe ninguna garantia de que la memoria este inicializada en 0 todas las veces, hay ocasiones en la que si lo esta y hay ocasiones en la que no esta veamos este ejemplo, el cual muestra de un arreglo de 20 elementos los que su valor inicial no sea 0,
Código
#include<stdio.h>
int main(){
int i;
int arreglo[20];
i =0;
while(i <20){
if(arreglo[i]!=0){
printf("La posicion %i del arreglo no esta inicializada su valor actual es %i\n",i,arreglo[i]);
}
i++;
}
return0;
}
La salida de ese codigo compilado con GCC para windows es:
Código:
La posicion 0 del arreglo no esta inicializada su valor actual es 4200160 La posicion 2 del arreglo no esta inicializada su valor actual es 21 La posicion 4 del arreglo no esta inicializada su valor actual es 9966448 La posicion 6 del arreglo no esta inicializada su valor actual es 1 La posicion 8 del arreglo no esta inicializada su valor actual es -1 La posicion 9 del arreglo no esta inicializada su valor actual es -1 La posicion 10 del arreglo no esta inicializada su valor actual es 4200261 La posicion 12 del arreglo no esta inicializada su valor actual es 1 La posicion 14 del arreglo no esta inicializada su valor actual es 4200137 La posicion 16 del arreglo no esta inicializada su valor actual es 3 La posicion 18 del arreglo no esta inicializada su valor actual es 21
Y la segunda vez que lo ejecute fue
Código:
La posicion 0 del arreglo no esta inicializada su valor actual es 4200160 La posicion 2 del arreglo no esta inicializada su valor actual es 21 La posicion 4 del arreglo no esta inicializada su valor actual es 12063600 La posicion 6 del arreglo no esta inicializada su valor actual es 1 La posicion 8 del arreglo no esta inicializada su valor actual es -1 La posicion 9 del arreglo no esta inicializada su valor actual es -1 La posicion 10 del arreglo no esta inicializada su valor actual es 4200261 La posicion 12 del arreglo no esta inicializada su valor actual es 1 La posicion 14 del arreglo no esta inicializada su valor actual es 4200137 La posicion 16 del arreglo no esta inicializada su valor actual es 3 La posicion 18 del arreglo no esta inicializada su valor actual es 21
Como ven algunos valores cambiaron y otros se mantiene similares..
Depende del programador inicializar la memoria correctamente, o por lo menos estar cociente de que es posible que tenga basura en la memoria.
Una forma de inicializar en 0 el arreglo mencioanado al momento de declararlo es:
Código
int arreglo[20]={0};
otra forma es utilizar las funciones para inicializar con X valor la memoria
if(pivote->vertices[j]->peso_actual > peso_nuevo){// Si esta condicion se cumple es mas rapido llegar al nodo pivote->vertices[j] mediante el nodo pivote
printf("Nueva mejor ruta a %i con peso de %i\n",pivote->vertices[j]->id,peso_nuevo);
pivote->vertices[j]->peso_actual = peso_nuevo;
pivote->vertices[j]->mejor_ruta = pivote;
}
printf("Ruta de %i a %i vale %i\n",nodo_a->id,pivote->vertices[j]->id,pivote->vertices[j]->peso_actual);
//En caso de que el if no se cumpla es mas rapido llegar al nodo pivote->vertices[j] de la manera en la ya habia sido visitado previamente
}
}
else{
//printf("El subnodo %i ya a sido visitado\n",pivote->vertices[j]->id);
printf("El subnodo %i ya a sido visitado\n",pivote->vertices[j]->id);
if(pivote->vertices[j]->peso_actual > peso_nuevo){// Si esta condicion se cumple es mas rapido llegar al nodo pivote->vertices[j] mediante el nodo pivote
printf("Nueva mejor ruta a %i con peso de %i\n",pivote->vertices[j]->id,peso_nuevo);
pivote->vertices[j]->peso_actual
= peso_nuevo;
pivote->vertices[j]->mejor_ruta = pivote;
}
printf("Ruta de %i a %i vale %i\n",nodo_a->id,pivote->vertices[j]->id,pivote->vertices[j]->peso_actual);
//En caso de que el if no se cumpla es mas rapido llegar al nodo pivote->vertices[j] de la manera en la ya habia sido visitado previamente
Casi todo marcha bien con el grafo a excepcion de la parte donde valido si un valor ya existe en el grafo. En el ultimo intento que hice llevaba maa de 140 mil nodos en el grafo y con cada posible nodo nuevo tenia que validar la existencia de su valor en el grafo (Muy lento)
Posteriormente use arreglo de los nodos existentes (Igualmente lento).
Entonces voy a usar un Arbol Binario.
Y la pregunta es esa ¿Hay algo mas eficiente que un arbol binario?
Lo pregunto por que no me he actualizado en mas de 5 años en estructuras de datos, estaba contemplando una tabla hash pero nunca la estudie y dudo que sea mas eficiente que un arbol binario en lo que se refiere a insercion y busqueda de nodos.
En la cuenta de Twitter de Den Delimarsky se puede leer que la aplicación por falta de validacion de certificado es vulnerable a ser engañada mediante un proxy y con llamadas a la API es posible navegar en el mundo de pokemon go desde la comodidad del hogar y sin los peligros de ser atropellado en la calle.
Muy buen dia como saben en mi canal de youtube tengo tutoriales de programación en C el ultimo que hice es el juego de Piedra Pepel y Tijera algo sencillo pero usando una Tabla de Estados simulando la forma mas básica de un autómata.
Dejo el codigo no sin antes proponerles un reto y es el siguiente: Dado el código siguiente modificarlo para que el programa sea capaz de "aprender" del histórico de jugadas del usuario y asi sea capas de predecir la próxima jugada.
Este aprendizaje no debe de perderse (Por lo tanto se debe de poder guardar para ser cargados en Futuros juegos)
Código
/*
Realizado por Luis Alberto
Contacto
Twitter: @albertobsd
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<stdbool.h>
//Constantes para las jugadas
#define PIEDRA 0
#define PAPEL 1
#define TIJERA 2
int main(){
int jugador =0, computadora =0;// Variables para la seleccion de los Jugadores (Usuario - Computadora)
char*jugadas[3]={"Piedra","Papel","Tijera"};//Cadenas para imprimir segun lo seleccionado por las variables Anteriores
/*
Exclusivamente para el resultado (Matriz bidimencional)
Columnas para la Computadora
Filas para el Jugador
Valores:
- 1 si el jugador Gana
- 0 si el jugador Empata
- 2 si el jugador Pierde
[0][P][G]
[G][0][P]
[P][G][0]
*/
int resultados[3][3]={{0,2,1},
{1,0,2},
{2,1,0}};
char*resultados_str[3]={"El jugador Empata","El Jugador Gana","El jugador Pierde"};// Cadenas con los resultados
bool entrar =true;//Variable para detener el ciclo
int opcion;//Opcion seleccionada
char temp[10];//Variable temporal para guardar la entrada desde el teclado
char*valor = NULL;//Puntero adicional usado por strtol
srand(time(NULL));// inicializar la semilla Pseudo-Aleatoria
do{
computadora =rand()%3;//Valor seleccionado por la computadora al azar
printf("Aprende a leer solo valores del 1 al 3 o la letra S mayuscula\n");
break;
}
}
else{//Si no es valor valido posiblemente sea una S
//printf("Elijio %.2x\n",valor[0]);
if(temp[0]=='S'){//Si es S establecemos la variable para salir del ciclo
entrar =false;
}
}
}while(entrar);
return0;
}
Aqui les dejo el vídeo mencionado:
Saludos!
He creado una estructura para guardar los resultados y posteriormente guardar la estructura en un archivo
De hecho son 2 estrucuturas:
Código
struct nodo_ppt {
int count;
int respuesta[3];
};
La estrucutura anterior guarda un contador para indicar cuantas veces se a entrado a ese nodo y posteriormente cual fue la respuesta a esto.
Por ejemplo tenemos un arreglo de 9 nodos
Código
struct nodo_ppt nodos[9];
Y por ejemplo se juega Piedra(Jugador) vs Tijera(Computadora) entonces al igual que en la matriz de resultados:
Código
int resultados[3][3]={{0,2,1},{1,0,2},{2,1,0}};
Entonces guardamos como nodos "previo" la posicion de nodos [(Jugador*3) +computadora] y en el proximo juego incrementamos la seleccion del jugador en el nodo previo y nuevamente ajustamos el nodo previo a la seleccion actual y repetimos.
Con esto tendremos un histórico de (Si en el juego anterior se juego X entonces en el juego siguiente Jugara Y (con mas probabilidad)) donde Y es el mayor numero seleccionado en el contador de respuesta