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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con rand()
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con rand()  (Leído 2,481 veces)
MrDev

Desconectado Desconectado

Mensajes: 31


Ver Perfil
Problema con rand()
« en: 12 Abril 2016, 20:41 pm »

Pues tengo un problema, y es que no me da los valores como numeros, me los da como direcciones de memoria supongo que son. Igualmente al poner en el main al principio "in t p=rand();" me daba un 0 todo el rato, aqui dejo el codigo a ver si me podeis echar una manilla.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. char* crearPassword();
  6.  
  7. int main(int argc, const char * argv[]) {
  8.    srand (time(NULL));
  9.  
  10.    float p=rand();
  11.  
  12.    char* contrasena=crearPassword();
  13.  
  14.    printf("%s",contrasena);
  15.  
  16.    return 0;
  17. }
  18.  
  19. char* crearPassword(){
  20.    int i;
  21.    char numero,aleatorio;
  22.    char *password=malloc(8*sizeof(char))+1;
  23.  
  24.    for(i=0;i<4;i++){
  25.        password[i]=(int)rand()%10;
  26.    }
  27.  
  28.    for(i=4;i<8;i++){
  29.        do{
  30.            aleatorio=(char)rand()%123;
  31.        }while(aleatorio<65 && aleatorio>122);
  32.        password[i]=aleatorio;
  33.    }
  34.  
  35.    return password;
  36. }


En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: Problema con rand()
« Respuesta #1 en: 12 Abril 2016, 22:41 pm »

Código
  1. do{
  2.    aleatorio=(char)rand()%123;
  3. }while(aleatorio<65 && aleatorio>122);

A ver una cosilla. El número aleatorio está entre 0 y 122, por lo que nunca va a ser mayor que 122. Lo que tendrías que hacer es calcular un número aleatorio entre 0 y la diferencia de 122 y 65, y luego sumarle 65 (aleatorio = (char)rand()%(122-65) + 65;).

También tienes que tener en cuenta que tienes que cambiar la semilla del generador de números aleatorios (rand()) con la función srand cada vez que generes un número aleatorio. Te aconsejo que uses srand(clock()).


En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
MrDev

Desconectado Desconectado

Mensajes: 31


Ver Perfil
Re: Problema con rand()
« Respuesta #2 en: 12 Abril 2016, 22:48 pm »

Código
  1. do{
  2.    aleatorio=(char)rand()%123;
  3. }while(aleatorio<65 && aleatorio>122);

A ver una cosilla. El número aleatorio está entre 0 y 122, por lo que nunca va a ser mayor que 122. Lo que tendrías que hacer es calcular un número aleatorio entre 0 y la diferencia de 122 y 65, y luego sumarle 65 (aleatorio = (char)rand()%(122-65) + 65;).

También tienes que tener en cuenta que tienes que cambiar la semilla del generador de números aleatorios (rand()) con la función srand cada vez que generes un número aleatorio. Te aconsejo que uses srand(clock()).

Gracias por la respuesta compi.

Edito, el problema es que en el primer bucle for de la funcion, no guarda en password los numeros :(
« Última modificación: 12 Abril 2016, 23:14 pm por MrDev » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problema con rand()
« Respuesta #3 en: 12 Abril 2016, 23:20 pm »

Código
  1. char *password=malloc(8*sizeof(char))+1;
Esto está mal. malloc te asigna una zona de memoria pero devuelves la posición 1 byte superior. Tal vez quisiste decir:
Código
  1. char *password=malloc((8+1)*sizeof(char));
para guardar la cadena más el caracter nulo.
Pero tampoco convence ya que rand podría generarte un 0 cuándo estás consiguiendo los números, con lo que la cadena resultante acabaría en ese momento. Por otra parte no estás escribiendo caracteres numéricos sino caracteres de control ASCII no imprimibles, por lo que a la hora de visualizar la cadena podrían aparecer efectos extraños en pantalla.
Tal vez quisiste decir:
Código
  1. for(i=0;i<4;i++)
  2.    password[i]=(int)rand()%10+'0';
;

Más. Si usas malloc para asignar memoria debes usar free para liberarla en cuanto no la uses. La penúltima instrucción de tu programa debería ser
Código
  1. free(contrasena);
« Última modificación: 12 Abril 2016, 23:23 pm por MAFUS » En línea

MrDev

Desconectado Desconectado

Mensajes: 31


Ver Perfil
Re: Problema con rand()
« Respuesta #4 en: 12 Abril 2016, 23:26 pm »

Código
  1. char *password=malloc(8*sizeof(char))+1;
Esto está mal. malloc te asigna una zona de memoria pero devuelves la posición 1 byte superior. Tal vez quisiste decir:
Código
  1. char *password=malloc((8+1)*sizeof(char));
para guardar la cadena más el caracter nulo.
Pero tampoco convence ya que rand podría generarte un 0 cuándo estás consiguiendo los números, con lo que la cadena resultante acabaría en ese momento. Por otra parte no estás escribiendo caracteres numéricos sino caracteres de control ASCII no imprimibles, por lo que a la hora de visualizar la cadena podrían aparecer efectos extraños en pantalla.
Tal vez quisiste decir:
Código
  1. for(i=0;i<4;i++)
  2.    password[i]=(int)rand()%10+'0';
;

Más. Si usas malloc para asignar memoria debes usar free para liberarla en cuanto no la uses. La penúltima instrucción de tu programa debería ser
Código
  1. free(contrasena);

Gracias por tu respuesta compi, ya esta el programa listo.

Una duda, en el
Código
  1. for(i=0;i<4;i++)
  2.    password[i]=(int)rand()%10+'0';
;

Por que no funciona sin el "'+0'"?
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problema con rand()
« Respuesta #5 en: 12 Abril 2016, 23:37 pm »

El hecho es que tu generas un carácter del ASCII 0 al ASCII 9, que son caracteres no imprimibles. Busca una tabla en internet de código ASCII y verás lo que digo. Pero al sumar '0' al resultado del rand lo que haces es llevar ese resultado al caracter ASCII '0' que ese sí ya es la representación del cero. ASCII dice que los caracteres numéricos van del cero hasta el nueve. Por tanto '0' + 0 es '0', '0' + 1 es '1', '0' + 2 es '2', etc.
Si te fijas lo mismo pasa con las letras: 'a' + 0 es 'a', 'a' + 1 es 'b'... 'A' + 0 es 'A', 'A' + 1 es 'B'...
En línea

MrDev

Desconectado Desconectado

Mensajes: 31


Ver Perfil
Re: Problema con rand()
« Respuesta #6 en: 12 Abril 2016, 23:42 pm »

El hecho es que tu generas un carácter del ASCII 0 al ASCII 9, que son caracteres no imprimibles. Busca una tabla en internet de código ASCII y verás lo que digo. Pero al sumar '0' al resultado del rand lo que haces es llevar ese resultado al caracter ASCII '0' que ese sí ya es la representación del cero. ASCII dice que los caracteres numéricos van del cero hasta el nueve. Por tanto '0' + 0 es '0', '0' + 1 es '1', '0' + 2 es '2', etc.
Si te fijas lo mismo pasa con las letras: 'a' + 0 es 'a', 'a' + 1 es 'b'... 'A' + 0 es 'A', 'A' + 1 es 'B'...

Gracias, ya lo entiendo, se aprende bastante en foros :)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Solucionado]Problema con rand() y arreglos.
Programación C/C++
GROV 2 3,791 Último mensaje 16 Julio 2012, 21:32 pm
por GROV
Problema con rand y srand en este codigo
Programación C/C++
pacosn1111 6 2,930 Último mensaje 26 Abril 2015, 20:09 pm
por Miky Gonzalez
(Consulta) Problema con rand en C - Problema de multiple Choice
Programación C/C++
palacio29 3 2,869 Último mensaje 20 Julio 2016, 18:38 pm
por palacio29
(Consulta) Problema con rand en C - Problema de multiple Choice
Programación C/C++
palacio29 1 2,688 Último mensaje 25 Julio 2016, 17:54 pm
por AlbertoBSD
problema en rand()
Programación C/C++
anonym2003 1 1,452 Último mensaje 22 Febrero 2017, 22:55 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines