• Sábado 21 de Diciembre de 2024, 17:21

Autor Tema:  Numero Aleatorios En C  (Leído 4331 veces)

i82maria

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Numero Aleatorios En C
« en: Martes 2 de Noviembre de 2004, 17:58 »
0
Hola quisiera si alguien me puede echar una mano, es que tengo una practica e la que tengo que generar una matriz de 4 * 5 elementos, y se rellena con numeros aleatorios, pues bien, no se muy bien como funciona pero creo que es con rand().
Lo que no entiendo es poruqe se llamaa la funcion randomize().
Alguien me puede ayudar a saber como funcionan los numeros aleatorios en C.
Si alguien me puede ayudar, me vendría bien, gracias.

Verás, es que el programa es en C, asi que no me sirve eso que me has puesto.
Gracias de todos modos, el codigo es este:

#include <stdio.h>
#include <stdlib.h>


main()
{
float **mat, *productos;
int n;
randomize();
generarMatriz(mat);
multiplicaColumnas(mat, rand() % n, productos);
mostrarSumaProductos(productos);
}

generarMatriz(float **m)
{
int i, j;

m = (float**) malloc(4*5 *sizeof(float));
randomize();
for(i=0; i<4; i++){
for(j=0; j<5; j++)
(int) *(m + i*5 +j) = rand() + rand() /100;
}
}

multiplicaColumnas(float **m, int ncolum, float *vp)
{
int i;
vp = (float *)malloc(5* sizeof(float));
for(i=0; i<4; i++)
// *vp++ = (*(m+ i*5)) * (*(m + i*5 + ncolum));
vp = m[0] * m[ncolum];
vp++;
}

mostrarSumaProductos(float *v)
{
int i, suma = 0;
for(i=0; i< 4; i++)
suma += *v;
*v++;
printf("%f\n", suma);
}

Si puedes echale un vistazo, y me dices si es que puedo suprimir el randomize,o no.Porqe es que la estoy compilando en linux, y el error, que me da es un
que dice q no reconoce randomize.
Por fa, si puedes contestame.
Gracias

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Numero Aleatorios En C
« Respuesta #1 en: Martes 2 de Noviembre de 2004, 18:49 »
0
Hola  :hola:

Para generar un numero aleatorio con rand() tienes que hacer esto

Código: Text
  1.  
  2.  
  3. //Debes incluir estas dos librerias
  4.  
  5. #include &#60;cstdlib&#62;  
  6. #include &#60;ctime&#62;
  7.  
  8. void main()
  9. {
  10. int valor;
  11. srand(time(NULL)); // generacion de una semilla a partir de los segundos del reloj
  12. valor= 1 + (rand() % 10);  // en valor se almacena el numero aleatorio
  13. }
  14.  
  15.  
  16.  

Espero que te sirva de ayuda, un saludo  :kicking:

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Numero Aleatorios En C
« Respuesta #2 en: Martes 2 de Noviembre de 2004, 18:49 »
0
Hola  :hola:

Para generar un numero aleatorio con rand() tienes que hacer esto

Código: Text
  1.  
  2.  
  3. //Debes incluir estas dos librerias
  4.  
  5. #include &#60;cstdlib&#62;  
  6. #include &#60;ctime&#62;
  7.  
  8. void main()
  9. {
  10. int valor;
  11. srand(time(NULL)); // generacion de una semilla a partir de los segundos del reloj
  12. valor= 1 + (rand() % 10);  // en valor se almacena el numero aleatorio
  13. }
  14.  
  15.  
  16.  

Espero que te sirva de ayuda, un saludo  :kicking:

i82maria

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: Numero Aleatorios En C
« Respuesta #3 en: Martes 2 de Noviembre de 2004, 18:57 »
0
Cita de: "Diodo"
Hola  :hola:

Para generar un numero aleatorio con rand() tienes que hacer esto

Código: Text
  1.  
  2.  
  3. //Debes incluir estas dos librerias
  4.  
  5. #include &#60;cstdlib&#62;  
  6. #include &#60;ctime&#62;
  7.  
  8. void main()
  9. {
  10. int valor;
  11. srand(time(NULL)); // generacion de una semilla a partir de los segundos del reloj
  12. valor= 1 + (rand() % 10);  // en valor se almacena el numero aleatorio
  13. }
  14.  
  15.  
  16.  

Espero que te sirva de ayuda, un saludo  :kicking:
Verás, es que el programa es en C, asi que no me sirve eso que me has puesto.
Gracias de todos modos, el codigo es este:

#include <stdio.h>
#include <stdlib.h>


main()
{
    float **mat, *productos;
    int n;
    randomize();
    generarMatriz(mat);
    multiplicaColumnas(mat, rand() % n, productos);
    mostrarSumaProductos(productos);
   }
   
 generarMatriz(float **m)
 {
    int i, j;
   
   m = (float**) malloc(4*5 *sizeof(float));
   randomize();
   for(i=0; i<4; i++){
      for(j=0; j<5; j++)
        (int) *(m + i*5 +j) = rand() + rand() /100;
        }
 }
 
 multiplicaColumnas(float **m, int ncolum, float *vp)
 {
   int i;
   vp = (float *)malloc(5* sizeof(float));
   for(i=0; i<4; i++)
      // *vp++ = (*(m+ i*5)) * (*(m + i*5 + ncolum));
      vp = m[0] * m[ncolum];
      vp++;
  }
 
  mostrarSumaProductos(float *v)
  {
    int i, suma = 0;
    for(i=0; i< 4; i++)
       suma += *v;
       *v++;
   printf("%f\n", suma);
   }
   
Si puedes echale un vistazo, y me dices si es que puedo suprimir el randomize,o no.Porqe es que la estoy compilando en linux, y el error, que me da es un
que dice q no reconoce randomize.
Por fa, si puedes contestame.
Gracias

i82maria

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: Numero Aleatorios En C
« Respuesta #4 en: Martes 2 de Noviembre de 2004, 19:13 »
0
Cita de: "Diodo"
Hola  :hola:

Para generar un numero aleatorio con rand() tienes que hacer esto

Código: Text
  1.  
  2.  
  3. //Debes incluir estas dos librerias
  4.  
  5. #include &#60;cstdlib&#62;  
  6. #include &#60;ctime&#62;
  7.  
  8. void main()
  9. {
  10. int valor;
  11. srand(time(NULL)); // generacion de una semilla a partir de los segundos del reloj
  12. valor= 1 + (rand() % 10);  // en valor se almacena el numero aleatorio
  13. }
  14.  
  15.  
  16.  

Espero que te sirva de ayuda, un saludo  :kicking:
Verás, es que el programa es en C, asi que no me sirve eso que me has puesto.
Gracias de todos modos, el codigo es este:

#include <stdio.h>
#include <stdlib.h>


main()
{
float **mat, *productos;
int n;
randomize();
generarMatriz(mat);
multiplicaColumnas(mat, rand() % n, productos);
mostrarSumaProductos(productos);
}

generarMatriz(float **m)
{
int i, j;

m = (float**) malloc(4*5 *sizeof(float));
randomize();
for(i=0; i<4; i++){
for(j=0; j<5; j++)
(int) *(m + i*5 +j) = rand() + rand() /100;
}
}

multiplicaColumnas(float **m, int ncolum, float *vp)
{
int i;
vp = (float *)malloc(5* sizeof(float));
for(i=0; i<4; i++)
// *vp++ = (*(m+ i*5)) * (*(m + i*5 + ncolum));
vp = m[0] * m[ncolum];
vp++;
}

mostrarSumaProductos(float *v)
{
int i, suma = 0;
for(i=0; i< 4; i++)
suma += *v;
*v++;
printf("%f\n", suma);
}

Si puedes echale un vistazo, y me dices si es que puedo suprimir el randomize,o no.Porqe es que la estoy compilando en linux, y el error, que me da es un
que dice q no reconoce randomize.
Por fa, si puedes contestame.Ah y de paso si puedes mirar lo que he puesto de las estructuras en C, es que no encuentro el fallo. y me da error de compilacion
Gracias

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Numero Aleatorios En C
« Respuesta #5 en: Miércoles 3 de Noviembre de 2004, 15:25 »
0
Hola

Ese codigo que te he puesto es de C, y creo que te deberia funcionar, sobre la funcion randomize no tengo ni idea, yo use ese codigo para un programilla y va perfectamente

Un saludo  :hola:

i82maria

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: Numero Aleatorios En C
« Respuesta #6 en: Miércoles 3 de Noviembre de 2004, 16:40 »
0
Cita de: "Diodo"
Hola

Ese codigo que te he puesto es de C, y creo que te deberia funcionar, sobre la funcion randomize no tengo ni idea, yo use ese codigo para un programilla y va perfectamente

Un saludo  :hola:
Gracias, es que resulta que este ejercicio es de un libro de C, de Programacion en C, y no sé si es que el modo de usar numeros aleatorios es un modo antiguo. Pero podias porfavor ayudarme a usar el modo que tu me dices en esta practica. Es que soy nueva en esto, gracias.
Saludos desde Andalucia

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Numero Aleatorios En C
« Respuesta #7 en: Jueves 4 de Noviembre de 2004, 11:29 »
0
Holas  :hola:

Como veo que estas bastante preocupada con el programa ese, te he hecho un miniprograma que calcula las matrices aleatorias y las muestra por pantalla, lo he hecho pasando en las funciones variables float[4][5] en vez de puntero por que yo lo veo mas facil asi para recorrerlas

Los problemas de generar numeros , matrices o lo que sea aleatorio normalmente llevan asociados un rango de valores posibles, aunque no especificas entre que valores.Calcular valores aleatorios entre 0 y infinito no suele ser factible, asi que en el ejemplo lo he hecho con valores float entre 1,00 y 100,99 para que se vea mejor.Aunque tu puedes modificarlo a tu gusto  :comp:

En el codigo te explico mas o menos como va el asunto,aunque hay un problema a la hora de generar los numeros aleatorios ya que la velocidad del procesador es bastante mayor que la del reloj, entonces no da tiempo a generar nuevas semillas entre componente y componente de la matriz.He solucionado esto un poco chapuceramente metiendole un retardo con un for, que siempre dependera del ordenador, por eso es una chapuza, si se te ocurre otra forma mejor que lo cambies.


Código: Text
  1.  
  2.  
  3. #include &#60;stdio.h&#62;
  4. #include &#60;stdlib.h&#62;
  5. #include &#60;cstdlib&#62;  
  6. #include &#60;ctime&#62;
  7.  
  8. float generarNumeroAleatorio();
  9. void generarMatriz(float m[4][5]);
  10. void mostrarMatriz(float m[4][5]);
  11.  
  12.  
  13. void main()
  14. {
  15. do
  16. {
  17. float mat[4][5];
  18. generarMatriz(mat);
  19. mostrarMatriz(mat);
  20. printf(&#34;&#092;n&#092;n Desea generar otra matriz---SI=ENTER / NO=n&#34;);
  21. }
  22. while(getchar()!='n');
  23.  
  24. }
  25.  
  26. // GENERACION DEL NUMERO ALEATORIO
  27. // Partiendo de que se quiere un numero aleatorio float entre 1 y 100, la parte decimal
  28. // la he restringido a 2 digitos
  29.  
  30. float generarNumeroAleatorio()
  31. {
  32.   float valor,entera,decimal;// valor sera el numero decimal aleatorio final,entera la parte
  33.                              // entera del numero y decimal la parte decimal
  34.  
  35.   srand(clock());         // tomo una semilla a partir de los segundos del reloj interno
  36.                             
  37.   entera= 1 + (rand() % 100); // como rand() nos dara un numero entero del que no sabemos
  38.                               // entre que numeros estara debemos hacer %100 para restringirlo
  39.                               // entre 0 y 99, ademas le sumamos 1 a ese valor para que el
  40.                                  // numero este entre 1 y 100
  41.  
  42.   decimal= 1 + (rand() % 100); // para la parte decimal se procede igual que con la entera
  43.   decimal/=100;                // pero luego la divido por 100 para que sea decimal
  44.  
  45.   valor=entera+decimal;        // finalmente sumo las dos partes y se lo asigno a valor
  46.  
  47.   return valor;                // y lo devuelvo
  48. }
  49.  
  50.  
  51. //GENERAR UNA MATRIZ
  52.  
  53. void generarMatriz(float m[4][5])
  54. {
  55.   int i,j; //indices apra recorrer la matriz
  56.  
  57.   for(i=0; i&#60;4; i++) // recorro las filas
  58.   {
  59.     for(j=0; j&#60;5; j++) // recorro las columnas
  60.     {
  61.       float numero=generarNumeroAleatorio();  //le asigno a numero el valor aleatorio
  62.       m[i][j]=numero;   // a cada valor de la matriz un numero aleatorio
  63.                                               // que devuelve generarNumeroAleatorio()
  64.       for(int t=0;t&#60;1200000;t++)  // Retardo para darle tiempo a srand a coger otra semilla
  65.       {                           // para el siguiente numero aleatorio.UN poco chapucero¡¡¡
  66.       }                          
  67.     
  68.     }
  69.   }
  70. }
  71.  
  72. // FUNCION QUE MUESTRA LA MATRIZ EN PANTALLA
  73.  
  74. void mostrarMatriz(float m[4][5])
  75. {
  76.   int i,j;
  77.  
  78.   printf(&#34;&#092;n&#092;n&#34;);
  79.   for(i=0; i&#60;4; i++)
  80.   {
  81.     printf(&#34;(&#34;);
  82.     for(j=0; j&#60;5; j++)
  83.     {
  84.       printf(&#34;   %3.2f&#34;,m[i][j]);
  85.     }
  86.     printf(&#34; )&#34;);
  87.     printf(&#34; &#092;n&#34;);
  88.   }
  89. }
  90.  
  91.  
  92.  

Espero que te sirva de ayuda y no te lie mas........ :lol:

Un saludo y suerte :kicking:

PD: te he adjuntado el fichero cpp
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

i82maria

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: Numero Aleatorios En C
« Respuesta #8 en: Domingo 7 de Noviembre de 2004, 12:55 »
0
Cita de: "Diodo"
Holas  :hola:

Como veo que estas bastante preocupada con el programa ese, te he hecho un miniprograma que calcula las matrices aleatorias y las muestra por pantalla, lo he hecho pasando en las funciones variables float[4][5] en vez de puntero por que yo lo veo mas facil asi para recorrerlas

Los problemas de generar numeros , matrices o lo que sea aleatorio normalmente llevan asociados un rango de valores posibles, aunque no especificas entre que valores.Calcular valores aleatorios entre 0 y infinito no suele ser factible, asi que en el ejemplo lo he hecho con valores float entre 1,00 y 100,99 para que se vea mejor.Aunque tu puedes modificarlo a tu gusto  :comp:

En el codigo te explico mas o menos como va el asunto,aunque hay un problema a la hora de generar los numeros aleatorios ya que la velocidad del procesador es bastante mayor que la del reloj, entonces no da tiempo a generar nuevas semillas entre componente y componente de la matriz.He solucionado esto un poco chapuceramente metiendole un retardo con un for, que siempre dependera del ordenador, por eso es una chapuza, si se te ocurre otra forma mejor que lo cambies.


Código: Text
  1.  
  2.  
  3. #include &#60;stdio.h&#62;
  4. #include &#60;stdlib.h&#62;
  5. #include &#60;cstdlib&#62;  
  6. #include &#60;ctime&#62;
  7.  
  8. float generarNumeroAleatorio();
  9. void generarMatriz(float m[4][5]);
  10. void mostrarMatriz(float m[4][5]);
  11.  
  12.  
  13. void main()
  14. {
  15. do
  16. {
  17. float mat[4][5];
  18. generarMatriz(mat);
  19. mostrarMatriz(mat);
  20. printf(&#34;&#092;n&#092;n Desea generar otra matriz---SI=ENTER / NO=n&#34;);
  21. }
  22. while(getchar()!='n');
  23.  
  24. }
  25.  
  26. // GENERACION DEL NUMERO ALEATORIO
  27. // Partiendo de que se quiere un numero aleatorio float entre 1 y 100, la parte decimal
  28. // la he restringido a 2 digitos
  29.  
  30. float generarNumeroAleatorio()
  31. {
  32.   float valor,entera,decimal;// valor sera el numero decimal aleatorio final,entera la parte
  33.                              // entera del numero y decimal la parte decimal
  34.  
  35.   srand(clock());         // tomo una semilla a partir de los segundos del reloj interno
  36.                             
  37.   entera= 1 + (rand() % 100); // como rand() nos dara un numero entero del que no sabemos
  38.                               // entre que numeros estara debemos hacer %100 para restringirlo
  39.                               // entre 0 y 99, ademas le sumamos 1 a ese valor para que el
  40.                                  // numero este entre 1 y 100
  41.  
  42.   decimal= 1 + (rand() % 100); // para la parte decimal se procede igual que con la entera
  43.   decimal/=100;                // pero luego la divido por 100 para que sea decimal
  44.  
  45.   valor=entera+decimal;        // finalmente sumo las dos partes y se lo asigno a valor
  46.  
  47.   return valor;                // y lo devuelvo
  48. }
  49.  
  50.  
  51. //GENERAR UNA MATRIZ
  52.  
  53. void generarMatriz(float m[4][5])
  54. {
  55.   int i,j; //indices apra recorrer la matriz
  56.  
  57.   for(i=0; i&#60;4; i++) // recorro las filas
  58.   {
  59.     for(j=0; j&#60;5; j++) // recorro las columnas
  60.     {
  61.       float numero=generarNumeroAleatorio();  //le asigno a numero el valor aleatorio
  62.       m[i][j]=numero;   // a cada valor de la matriz un numero aleatorio
  63.                                               // que devuelve generarNumeroAleatorio()
  64.       for(int t=0;t&#60;1200000;t++)  // Retardo para darle tiempo a srand a coger otra semilla
  65.       {                           // para el siguiente numero aleatorio.UN poco chapucero¡¡¡
  66.       }                          
  67.     
  68.     }
  69.   }
  70. }
  71.  
  72. // FUNCION QUE MUESTRA LA MATRIZ EN PANTALLA
  73.  
  74. void mostrarMatriz(float m[4][5])
  75. {
  76.   int i,j;
  77.  
  78.   printf(&#34;&#092;n&#092;n&#34;);
  79.   for(i=0; i&#60;4; i++)
  80.   {
  81.     printf(&#34;(&#34;);
  82.     for(j=0; j&#60;5; j++)
  83.     {
  84.       printf(&#34;   %3.2f&#34;,m[i][j]);
  85.     }
  86.     printf(&#34; )&#34;);
  87.     printf(&#34; &#092;n&#34;);
  88.   }
  89. }
  90.  
  91.  
  92.  

Espero que te sirva de ayuda y no te lie mas........ :lol:

Un saludo y suerte :kicking:

PD: te he adjuntado el fichero cpp
Gracias me has ayudado mucho, eres muy amable, si puedes lee mi pregunta esa de las estructuras, a ver si entiendo mejor el fallo, porque es que no le entiendo.
Saludos

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Numero Aleatorios En C
« Respuesta #9 en: Domingo 7 de Noviembre de 2004, 15:46 »
0
Holas  :hola:  Me alegro que te sirviera de ayuda

Si puedes adjunta el archivo cpp para echarle un vistazo, que se ven mejor los errores desde el compilador.

ht luego

i82maria

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: Numero Aleatorios En C
« Respuesta #10 en: Domingo 7 de Noviembre de 2004, 19:34 »
0
Cita de: "Diodo"
Holas  :hola:  Me alegro que te sirviera de ayuda

Si puedes adjunta el archivo cpp para echarle un vistazo, que se ven mejor los errores desde el compilador.

ht luego
Verás ayudarme en el sentido de comprender más o menos lo que dices si, pero en mi práctica insisto es de C, y no admite la libreria <cstdlib>, sino stdlib.h.
Asi que aqui te adjunto el codigo, y lo he compilado, compila pero al ejecutar es segmentation fault.

[CODE]
/*Escribir un programa para generar una matriz de 4 x 5 elementos reales,
multiplicar la primera columna por cualquier otra y mostrar la suma de los
productos. El programa debe descomponerse en subproblemas y utilizar punteros
para acceder a los elementos de la matriz*/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


main()
{
    float **mat, *productos;
    int n;
    srand(time(NULL));
    generarMatriz(mat);
    multiplicaColumnas(mat, rand() % n, productos);
    mostrarSumaProductos(productos);
   }
   
 generarMatriz(float **m)
 {
    int i, j;
   
   m = (float**) malloc(4*5 *sizeof(float));
   //randomize();
   for(i=0; i<4; i++){
      for(j=0; j<5; j++)
        (int) *(m + i*5 +j) = rand() + rand() /100;
        }
 }
 
 multiplicaColumnas(float **m, int ncolum, float *vp)
 {
   int i;
   vp = (float *)malloc(5* sizeof(float));
   for(i=0; i<4; i++)
      // *vp++ = (*(m+ i*5)) * (*(m + i*5 + ncolum));
      vp = m[0] * m[ncolum];
      vp++;
  }
 
  mostrarSumaProductos(float *v)
  {
    int i, suma = 0;
    for(i=0; i< 4; i++)
       suma += *v;
       *v++;
   printf("%f\n", suma);
   }
   
Por favor, si puedes miramelo , gracias
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.