elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda adivinar numero sin fallar
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda adivinar numero sin fallar  (Leído 2,791 veces)
Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Duda adivinar numero sin fallar
« en: 25 Junio 2019, 11:26 am »

Hola tengo una duda sobre este programita que hice, lo que quiero es saber si hay alguna forma de que el usuario adivine siempre en el primer intento pero sin saber el numero aleatorio que almaceno la variable dato, tambien sin trampas, en otras palabras hackear de alguna forma el valor aleatorio obtenido.

Código
  1. int main()
  2. {
  3. int n, dato, contador=0;
  4. srand(time(NULL));
  5. dato=1+rand()%100;
  6. do{
  7. cout<<"Ingrese un numero: ";
  8. cin>>n;
  9. if(n>dato)
  10. cout<<"Ingrese un numero menor"<<endl;
  11. else if(n<dato)
  12. cout<<"Ingrese un numero mayor"<<endl;
  13. else
  14. cout<<"FELICIDADES, ADIVINASTE!!!"<<endl;
  15. contador++;
  16. }while(n!=dato);
  17. cout<<"Cantidad de intentos: "<<contador<<endl;
  18. system("pause");
  19. return 0;
  20. }

 ;-) :laugh: :xD >:D :rolleyes: :huh: ;D


En línea

7w7
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Duda adivinar numero sin fallar
« Respuesta #1 en: 25 Junio 2019, 14:55 pm »

Quieres decir que el generador de números aleatorios adivine el número que piensa una persona?


En línea

jmpesp

Desconectado Desconectado

Mensajes: 21


Ver Perfil
Re: Duda adivinar numero sin fallar
« Respuesta #2 en: 25 Junio 2019, 15:40 pm »

Si el usuario obtiene la direccion de memoria donde se esta almacenando la variable "dato", tendra el numero aleatorio exacto que se genero.

O si el usuario modifica la funcion rand() para que devuelva siempre el mismo valor (parcheando el binario).

Si a lo que te referis es si el programa es "seguro" (refiriendome a que el numero aleatorio sea realmente aleatorio) tampoco es tan asi...

Es posible predecir el resultado de rand() porque estas usando el timestamp actual como semilla.
En línea

RayR

Desconectado Desconectado

Mensajes: 239


Ver Perfil
Re: Duda adivinar numero sin fallar
« Respuesta #3 en: 25 Junio 2019, 18:43 pm »

Sí es posible, pero bajo ciertas condiciones. Como dices que sin "trampa", descarto accesos a la memoria de tu programa o modificaciones al mismo. En ese caso, lo que el usuario necesita para adivinar el número generado es saber como está implementada la función rand y conocer la semilla, en este caso, la hora exacta a la que time(NULL) calcula el valor que retornará. En un caso tan simple como tu código de ejemplo, donde time se ejecuta al inicio, esto básicamente equivale a saber a qué hora se ejecuta el programa (hora, minuto y segundo).

El valor retornado por time es el número de segundos transcurridos desde el 1 de enero de 1970. Así que, sabiendo la hora, no es difícil calcular este valor, que se usará como semilla para srand. Podría haber una variación de un segundo, por ejemplo, si tu programa es ejecutado a las 11:30:52, pero el segundo 52 estaba por concluir, puede que time se ejecute a las 11:30:53.

Esto no es sólo teórico. Por ejemplo, en Windows, el valor retornado por rand() la primera vez que se invoque es:

Código:
( (semilla * 214013L + 2531011L) >> 16 ) & 0x7fff

Así que si el usuario puede ver la hora, incluyendo segundos, a la que se ejecuta el programa, sí, es bastante factible que pueda adivinar el número al primer o segundo intento.
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Duda adivinar numero sin fallar
« Respuesta #4 en: 26 Junio 2019, 00:21 am »

Pero entonces el usuario sabría qué número aleatorio saldría, violando una de las premisas del enunciado que dice:

Citar
... sin saber el numero aleatorio que almaceno la variable dato ...
En línea

RayR

Desconectado Desconectado

Mensajes: 239


Ver Perfil
Re: Duda adivinar numero sin fallar
« Respuesta #5 en: 26 Junio 2019, 02:44 am »

Pero entonces el usuario sabría qué número aleatorio saldría, violando una de las premisas del enunciado que dice:


¿Es en referencia a mi mensaje? Si es así, realmente no se viola la premisa. Por definición, si el usuario es capaz de deducir el número, significa que sabe el número. Podrá haberlo sabido apenas un segundo (o medio, o una décima) antes de decirlo, pero lo tuvo que saber. No puede saber y no saber al mismo tiempo. Dado que éste no es un foro de esoterismo sino de programación, doy por sentado que cuando Beginner Web escribe "sin saber el numero aleatorio que almaceno la variable dato" se refriere a sin conocer el número a priori, sin husmear en la memoria, o a cualquier otra forma de trampa; es decir, no usa el término "adivinar" en sentido literal, sino refiriéndose a si existe alguna forma efectiva para que el usuario deduzca el número generado.

En mi respuesta proporciono una forma de hacer eso, simplemente sabiendo cómo funciona la generación de números pseudoaleatorios en C (además de voltear a ver la hora al ejecutar el programa) y haciendo unos pocos cálculos sencillos. No considero que esto califique como trampa, de la misma forma que estudiar antes de un examen de álgebra, y por lo tanto, saber cómo se resuelve una ecuación, no es hacer trampa.
En línea

@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.397


Turn off the red ligth


Ver Perfil WWW
Re: Duda adivinar numero sin fallar
« Respuesta #6 en: 26 Junio 2019, 19:12 pm »

Hay opciones más aleatorias.
Yo pongo un for a correr con un i++; --i; i=i+1 hasta 10000.
Pongo un contador static para guardar el tiempo de ejecución.. Utilizo el tiempo de ejecución como seed con high_resolution_clock de <chronos>. Esto ya es aleatorio total. Temperatura procesador, tiempo de acceso a ram del procesador, estado del sistema, numero de procesos, espacio de ram utilizado, temperatura ram, temperatura placa, energía de condensadores... El más mínimo cambio afecta.
Si quieres acrecentar aún más la aletoriedad puedes hacer operaciones paea aumentar el número obtenido antes de usarlo como numero aleatorio. No necesitas ni rand. Puedes operar con el número obtenido y llamar al for cada vez que quieras generar un numero aleatorio.
En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

huchoko

Desconectado Desconectado

Mensajes: 97


Ver Perfil WWW
Re: Duda adivinar numero sin fallar
« Respuesta #7 en: 29 Junio 2019, 00:06 am »

Como todos saben, rand() es seudoaleatorio. Más, la implementación de la función rand() en la librería estándar de C usa el Generador linear congruencial, un algoritmo muy simple para obtener números seudoaleatorios, y es fácilmente predecible.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Script adivinar numero en bash
Scripting
andaluz 9 12,912 Último mensaje 22 Noviembre 2011, 12:59 pm
por andaluz
¿Qué puede fallar en esta optimización?
Programación C/C++
bichovis 0 4,324 Último mensaje 12 Diciembre 2011, 01:40 am
por bichovis
Programa que no funciona para adivinar un numero
.NET (C#, VB.NET, ASP)
eva87 1 2,781 Último mensaje 19 Abril 2012, 00:28 am
por $Edu$
Al mover mi portatil empieza a fallar
Hardware
borjaperez1 0 1,411 Último mensaje 25 Julio 2014, 18:38 pm
por borjaperez1
Adivinar número más probable falla creo.
Scripting
Tachikomaia 5 3,673 Último mensaje 26 Febrero 2021, 13:31 pm
por nosoy
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines