SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: kenshin en Lunes 18 de Febrero de 2002, 10:08

Título: Re: Desesperado... :-)
Publicado por: kenshin en Lunes 18 de Febrero de 2002, 10:08
Por qué al compilar con DEV C++ no consigo un número aleatorio?...es rarísimo, pongo:
int a=rand(10); (tratando de obtener un número aleatorio entre 0-10 y siempre da como resultado 41!)...¿alguien puede ayudarme?
Título: Re: Desesperado... :-)
Publicado por: jpastor en Lunes 18 de Febrero de 2002, 15:54
La función rand devuelve un numero aleatorio solo en parte, ya que realmente es imposible predecir el numero que saldrá, pero siempre saldra el mismo.

Para solucionar el problema tienes que usar la funcion srand que sirve para indicar una semilla que luego se utilizara para crear los numero.

Si llamamos a srand con alguna variable como el tiempo (antes de intentar obtener un numero con rand) obtendrás numero totalmente aleatorios:

srand (time(NULL));
Título: Re: Desesperado... :-)
Publicado por: makeijan en Lunes 18 de Febrero de 2002, 17:16
Yo no estoy muy puesto en el tema aún, pero lo que utilizaría es:

randomize();
int a=random(10);

Recuerda llamar a randomize, siempre antes de usar random .

Espero haberte sido de ayuda.
Título: Re: Desesperado... :-)
Publicado por: tenesor en Lunes 18 de Febrero de 2002, 19:50
Hola!

El randomize() (creo recordar) que es de borland, asi que al compilarlo con GCC, DEVC++4 o cualquiera distinto del de borland dará error.

Para sacar numeros aleatorios utilizo lo tipico del ANSI, aca te lo pongo.

#include <time.h> // Pa que funcione el rand
srand(time(0)); // el randomize de ANSI
x=rand()%100; // Aqui asigna a 'x' un numero aleatorio de 0 a 100

Saludos,
   Tenesor
Título: Re: Desesperado... :-)
Publicado por: kenshin en Lunes 18 de Febrero de 2002, 21:40
GrAcIaS!, ya he conseguido hacerlo...

...Hasta pronto, porque seguro que me surgen más dudas!

K_e_N_s_H_i_N
Título: Re: Desesperado... :-)
Publicado por: kenshin en Lunes 18 de Febrero de 2002, 22:51
¿Alguien sabe si es posible y cómo hacer lo siguiente?...

Tengo un entero de 5 cifras (12345 p.ejemplo) y me gustaría almacenarlo en un array, de manera que al primer elemento del array le corresponda la primera cifra del entero y así sucesivamente: array[0]=1;array[1]=2;etc...

GRACIAS!!
Título: Re: Desesperado... :-)
Publicado por: tenesor en Martes 19 de Febrero de 2002, 03:55
OK, como lo cuentas es muy simple:
-----------------------------------------
int x;    // Donde se almacenara el numero
int y[4]; // El array que almacenara las 5 cifras (0,1,2,3,4)
int cont; // Una variable contador para el bucle

printf("Introduce un entero de 5 cifras: ");
scanf("%i",x); // Guardamos el numero en 'x'

do{ // Aqui el bucle culpable de todo:)
    y[cont]=x; // guardamos 'x' en la variable 'cont' del array. La primera vez que entra, cont = 0, por lo tanto y[0]
    cont++; // Luego le sumamos uno a 'cont'  y empezamos de nuevo
}while(cont != 4); // a no ser que lleguemos a 4 (Quinta cifra)
-------------------------------------------

Por supuesto, esto funciona si sabes que te han metido 5 cifras o menos (si te meten 4 la 5ª = 0...)

Si quieres controlarlo mejor, deberias hacer esto:
-----------------------------------------

char x,*y;
int cont, numlon;

printf("Introduce un numero: ");
scanf("%s",x);

numlon = strlen(x);

do{
  y[cont] = x;
  cont ++;
}while(cont != numlon);

------------------------------------------

Con esto haces que te metan las cifras(o caracteres, que aqui tambien serian admitidos) que te metan, siempre guardara cada uno en el elemento del array que le corresponda.

Esto no lo he probado, pero supongo que funcionara:) Lo acabo ahora mismo pero si no funciona por lo menos ya tienes la idea.

Saludos,
   Tenesor
Título: Re: Desesperado... :-)
Publicado por: kenshin en Martes 19 de Febrero de 2002, 22:22
Gracias Tenesor;)
Título: Re: Desesperado... :-)
Publicado por: delpa en Martes 19 de Febrero de 2002, 23:56
justo iba a poner un mensaje pidiendo ayuda sobre un codigo como ese de ahi arriba:)
thx  very much tenesor
Título: Re: Desesperado... :-)
Publicado por: jpastor en Miércoles 20 de Febrero de 2002, 17:46
Citar
OK, como lo cuentas es muy simple:
-----------------------------------------
int x;    // Donde se almacenara el numero
int y[4]; // El array que almacenara las 5 cifras (0,1,2,3,4)
int cont; // Una variable contador para el bucle

printf("Introduce un entero de 5 cifras: ");
scanf("%i",x); // Guardamos el numero en 'x'


lo correcto si queremos obtener el número sería: scanf ("%i", &x);

 
Citar
do{ // Aqui el bucle culpable de todo:)
    y[cont]=x; // guardamos 'x' en la variable 'cont' del array. La primera vez que entra, cont = 0, por lo tanto y[0]
    cont++; // Luego le sumamos uno a 'cont'  y empezamos de nuevo
}while(cont != 4); // a no ser que lleguemos a 4 (Quinta cifra)


¿todos lo elementos de y no sería iguales y de valor x?

 
Citar

Por supuesto, esto funciona si sabes que te han metido 5 cifras o menos (si te meten 4 la 5ª = 0...)

Si quieres controlarlo mejor, deberias hacer esto:
-----------------------------------------

char x,*y;


hay que definir x como un array: char x[80]; por ejemplo.

 
Citar
int cont, numlon;

printf("Introduce un numero: ");
scanf("%s",x);

numlon = strlen(x);


tienes que reservar la memoria que quieres para y:

y = (char *)malloc(sizeof(char) * numlon);

 
Citar
do{
  y[cont] = x;
  cont ++;
}while(cont != numlon);



creo que tendria que ser:

y[cont] = x[cont];


[Modificado el 2/20/02 por jpastor]
Título: Re: Desesperado... :-)
Publicado por: ibito en Miércoles 20 de Febrero de 2002, 20:07
Cuales son todas las funciones q regresan numeros aleatorios?

Thanks
Título: Re: Desesperado... :-)
Publicado por: rafael en Miércoles 20 de Febrero de 2002, 21:28
y que tal esta otra solución?;)

  #include<stdio.h>

#define MAXDIGITOS 20

int main(){
   long int n;
   int t,a[MAXDIGITOS];
   int num_digitos,i,j;

   /* obtener el entero */
   printf("N:");
   scanf("%ld",&n);

   /* poner cada digito del numero en el arreglo */
   num_digitos=0;   
   while(n>0){
      a[num_digitos++]=n%10;
      n=n/10;
   }

   /* invertir los elementos del arreglo para que los digitos esten en el
   orden correcto */
   i=0;j=num_digitos-1;
   while(i<j){
      /* intercambiar los valores de los elementos i y j del arreglo */
      t=a;
      a=a[j];
      a[j]=t;

      i++;j--;
   }

   /* escribir los digitos contenidos en el arreglo */
   for(i=0;i<num_digitos;i++){
      printf("%dn",a);
   }
   
   return 0;
}
Título: Re: Desesperado... :-)
Publicado por: tenesor en Miércoles 20 de Febrero de 2002, 21:58
OK, esta vez comprobé el codigo haciendolo y compilandolo:) El de antes lo hice en la ventana de aqui de solo codigo y no comprobé nada:(

Lo del & fue un pequeño despiste, lo de que todos los elementos de y[cont] serian = x es cierto. Vengo de pascal y se me mezclaron los dos. En pascal (en c no lo se) puedes tratar las strings como arrays. por ejemplo, para acceder al caracter numero 2 del string x, simplemente seria x[2]. Al hacerlo en c y con prisas se me colo es pequeño gran error.

En cuanto a lo de decir que X sea array, no estoy muy seguro... asi lo que harias seria almacenar en x[0] la cifra que te han metido, y de x[1] a x[80] serian todo valores nulos.

Lo de reservar la memoria es algo que veo innecesario aqui y que complica y alarga el programa (una funcion en principio simple).

Creo que lo que hay que hacer es recorrer uno por uno los caracteres almacenados en un char (x) y alamcenandolos uno por uno en cada elemento de y, no?
Por lo tanto seria un bucle que recorra los caracteres de X y cada uno almacenarlos en el elemento [cont] del array Y

No se si me explico...
Ahora me pondré a hacerlo y cuando termine paso el codigo.

Saludos,
   Teneosr
Título: Re: Desesperado... :-)
Publicado por: tenesor en Miércoles 20 de Febrero de 2002, 22:03
Perdona rafael, no vi tu mensaje.

Me gusta esa solucion, solo que creo que se podría acortar un poco.

Ah, una cosa.
A es un array y T un entero
En la sentencia "t=a;" no daria un error de "tipos incompatibles"? O almacenaria el numero de elementos de a en t?
Título: Re: Desesperado... :-)
Publicado por: tenesor en Miércoles 20 de Febrero de 2002, 23:14
Bueno, al final he recortado codigo todo lo que he podido, alguien lo puede acortar mas?

Con esto lo que hace es que te pide que le metas caracteres hasta que el usuario pulsa intro. Los va almacenando uno a uno en el elemento [cont] del array txt. Es otra forma de hacerlo, no?


Esta vez he probado el codigo antes de enviarlo al foro:)

Saludos,
   Tenesor


#define ENTER 13

main()
{
   char txt[100], chr;
   int cont;

   printf("nIntroduce caracteres: ");
   while (chr != ENTER)
   {
      chr = getche();
      txt[cont]=chr;
      cont++;   
   }         
}
Título: Re: Desesperado... :-)
Publicado por: jpastor en Jueves 21 de Febrero de 2002, 14:04
Hola de nuevo tenesor, lo de que x sea un array (en el segundo ejemplo que pusistes) es necesarior porque un char simple solo sirve para almacenar un caracter y tu necesitas obtener una cadena de caracteres.

La funcion scanf ("%s", x); te guarda cada caracter de la cadena que le metas en cada posicion de x: x[0] x[1] ...

En cuanto a reservar memoria tambien es necesario. Puede que cuando lo compiles y ejecutes no te de problema pero aun asi no esta bien. y[0] y[1] ... se almacenaran a la memoria donde apunte *y. Y si no reservas la memoria puede que este siendo ocupada por otros datos importantes o que otros datos la utilicen mas tarde y te borren lo que tienes.
Título: Re: Desesperado... :-)
Publicado por: jpastor en Jueves 21 de Febrero de 2002, 14:09
ahh, otra cosa, lo de que t=a no se puede hacer es verdad, aunque no es fallo de rafael.

El puso t=a[ i] pero el sistema de foros lo interpreta como el inicio de la letra cursiva y no lo escribe.
Título: Re: Desesperado... :-)
Publicado por: tenesor en Jueves 21 de Febrero de 2002, 21:01
De acuerdo, vamos a ver si esta va la vencida. Con este programa he tenido diversos problemas en XP, pero lo he probado en win 98 y ha funcionado. Con estas experiencias ya pille el porque del malloc, y en cuanto a lo de 'X' sea array estoy deacuerdo. Tengo una mezcla extraña de lenguajes en mi cabeza y confundia el char de C con el String de Pascal:(

Bueno, aki va el codigo.

--------------------------------------------
      char x[100],*y;
      int cont, numlon;

      printf("Introduce numeros: ");
      scanf("%s",x);

      numlon = strlen(x);
      y = (char *)malloc(sizeof(x));

      do{
         y[cont] = x[cont];
         cont ++;
         printf("nY = %s  X = %s",y[cont], x[cont]);
      }while(cont != numlon);

      free(y);
-------------------------------------------
Título: Re: Desesperado... :-)
Publicado por: tenesor en Jueves 21 de Febrero de 2002, 21:03
AH, gracias por todo lo que estas explicando, son cosas básicas que ya habia olvidado, pero se agradece y mucho.
Título: Re: Desesperado... :-)
Publicado por: rafael en Viernes 22 de Febrero de 2002, 01:56
;)Bueno tenesor es que yo trate de hacerlo exacto a lo que  kenshin pidio.
 
Citar
¿Alguien sabe si es posible y cómo hacer lo siguiente?...

Tengo un entero de 5 cifras (12345 p.ejemplo) y me gustaría almacenarlo en un array, de manera que al primer elemento del array le corresponda la primera cifra del entero y así sucesivamente: array[0]=1;array[1]=2;etc...

 
Título: Re: Desesperado... :-)
Publicado por: rafael en Viernes 22 de Febrero de 2002, 02:06
En cuanto a la parte que aparece como:

i=0;j=num_digitos-1;
while(i<j){
/* intercambiar los valores de los elementos i y j del arreglo */
t=a;
a=a[j];
a[j]=t;

i++;j--;
}


debia ser:

i=0;j=num_digitos-1;
while(i<j){
/* intercambiar los valores de los elementos i y j del arreglo */
t=a;
a=a[j];
a[j]=t;

i++;j--;
}

Gracias por indicarme el error.
Título: Re: Desesperado... :-)
Publicado por: tenesor en Viernes 22 de Febrero de 2002, 02:52
Hola Rafael!

Si, ya se que pidio numeros enteros, pero es que empezamos con evoluciones, si te das cuenta, la primera respuesta (aunque erronea) iba con los numeros. Luego pase a caracteres.

De todas formas, el mismo codigo que escribi solo hay que añadirle una linea para que recoja caracteres hasta que sea NUMEROS, u otra solucion seria bloquear el teclado exceptuando los numeros, el backspace y el intro.

Esto no se exactamente como hacerlo pero lo puedo mirar....

Ah, ya dije que me gusto tu codigo, pero si se usa como función de un programa mas largo, es aconsejable acortarlo todo lo posible.

Saludos,
Tenesor
Título: Re: Desesperado... :-)
Publicado por: jpastor en Viernes 22 de Febrero de 2002, 15:44
ok amigos, me acorde de una forma muy rápida y sencilla de hacerlo:


char numero_str[100];
int numero = 12345;

sprintf (numero_str, "%d", numero);
Título: Re: Desesperado... :-)
Publicado por: jpastor en Viernes 22 de Febrero de 2002, 15:49
Si estas pensando que me pase con el tamaño (100) de numero_str tienes razón, ningun número dentro de rango tiene tantos dígitos.

Es solo la costumbre. :D
Título: Desesperado... :-)
Publicado por: tenesor en Viernes 22 de Febrero de 2002, 18:19
VAYA! Muchisimo mejor! todo en una sola linea!!

Gracias :)
Título: Re: Desesperado... :-)
Publicado por: MgTaGod en Sábado 14 de Mayo de 2005, 14:49
Wenas a todos, es mi primer post en este foro y quisiera preguntar ya q hablamos del Random, quiero tener proposiciones como estas

P < Q
w >= R
R v T
u ^ j

por ejemplo pero los operadores: < , >=, v y ^, Tienen q salir aleatoriamente asi como hacemos con los numeros, como le asigno a la variable Random los valores q quiero q haga al azar...

Muchas gracias ...

Luis Leon
Comunidad de programadores de la universidad de oriente. Venezuela
Título: Re: Desesperado... :-)
Publicado por: carmamezo en Sábado 14 de Mayo de 2005, 16:25
crea una tabla que relacione a cada operador con un número, cada vez que generes aleatoriamente un número también será aleatorio el símbolo correspondiente a ese número.
un ejemplo:
1 <
2 >
3 =
4 ^
5 <=
6 >=

Ahora lo único que tienes que hacer es acotar el número aleatorio generado entre 1 y 6.  Si sale el 4 pues usas el símbolo relacionado con el 4 en este caso ^, si sale el 1 pues usas el < ...
Un saludo.  :lightsabre: