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)
| | |-+  Código fuente para sumar números enteros aleatorios
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Código fuente para sumar números enteros aleatorios  (Leído 13,299 veces)
UmbraNoche

Desconectado Desconectado

Mensajes: 11


Persevera y Triunfarás


Ver Perfil
Código fuente para sumar números enteros aleatorios
« en: 1 Abril 2012, 19:47 pm »

Damas y caballeros, este es mi primer aporte. Se trata de un programa que me habían dejado en la universidad como tarea. El enunciado de la tarea dice así: Realice un programa que llene dos arreglos unidimensionales de 10 elementos con valores aleatorios enteros de 1 a 15. En cada arreglo no puede existir el mismo número repetido, pero si puede existir en el otro arreglo. Cuando termina de llenar los arreglos debe mostrar su contenido uno a la par del otro, como se muestra a continuación:

Posicion        Arreglo 1            Arreglo 2
     1                 10                     8
     2                 15                     7
     3                  1                      6
     4                  6                      4
     5                 12                     9
     6                  9                    11
     ....

Luego deberá sumar los resultados en un tercer arreglo tomando el primer elemento del arreglo 1 y sumarlo con el último elemento del arreglo 2, valore que irá en la posición 1 del arreglo 3.
Al finalizar la suma de los elementos debe mostrar el resultado del tercer vector como se muestra a continuación:

Posicion      Arreglo 3
      1                     21
      2                     24
      3                      5
      4                     12
      5                     19
      6                     17

A cada les dejo el código fuente del programa. Me gustaría que opinen, den sugerencias. Yo apenas estoy empezando en el mundo de la programación. Así que todas sus sugerencias serán bienvenidas


//Suma de arreglos.

#include <iostream>

using std::cout;
using std::endl;

#include <iomanip>

using std::setw;

#include <cstdlib>

#include <ctime>

// la función main comienza la ejecución del programa

int main()
{
    // se declara los arreglos

    int x[ 11 ] ;
    int y[ 11 ] ;
    int z[ 11 ] ;

    // se declara las variables

    int a1 = 0;
    int a2 = 0;

   srand( time( 0 ) ); // semilla generadora de números aleatorios

   cout << "Posicion" << setw( 17 ) << "Arreglo 1"
    << setw( 17 ) << "Arreglo 2" << "\n" << endl;

    for ( int i = 1; i < 11; i++ )
    {
        a1 = (1 + rand() % 15);

        a2 = (1 + rand() % 15);

    int h = 0;
    int p = 0;

    // se declara estructuras de control para evitar que los números aleatorios se repitan

    while (h < i)
        {
              if (a1 != x[h])
              {
                  h++;
              }
              else
              {
                  a1 =(1 + rand() % 15);
                  h = 0;
              }
        }

        while (p < i)
        {
              if (a2 != y[p])
              {
                  p++;
              }
              else
              {
                  a2 =(1 + rand() % 15);
                  p = 0;
              }
        }

        //los arreglos se les asigna las varables

        x = a1;
        y = a2;


      cout << setw ( 9 ) << i
           << setw ( 16 ) << x[ i ]
           << setw ( 18 ) << y[ i ] << endl;



    }

 cout << "\n La suma de los Arreglos es:\n ";

       int haciaAdelante = 1;
       int haciaAtras = 11;

    // se declara una estructura de control para hacer la suma de los arreglos de forma diagonal

    for (haciaAdelante = 0; haciaAdelante < 11; haciaAdelante++)
    {
        z [haciaAdelante] = x[haciaAdelante] + y[haciaAtras];
        haciaAtras--;
    }

 cout << "\nPosicion" << setw( 17 ) << "Arreglo 3" << "\n" << endl;

 for ( int n = 1; n <= 10; n++ )
      cout << setw ( 9 ) << n  << setw ( 16 ) << z[ n ] << endl;

    system("PAUSE");
    return 0;

} //fin de la función main


En línea

"Si tienes un sueño entonces aferrate a el con constancia, sacrificio y dedicación".
s00rk

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: Código fuente para sumar números enteros aleatorios
« Respuesta #1 en: 1 Abril 2012, 20:26 pm »

Oooh nice, me gusto la forma que lo haces hehee mas esta partesita:
Código
  1.       int haciaAdelante = 1;
  2.       int haciaAtras = 11;
  3.  
  4.    // se declara una estructura de control para hacer la suma de los arreglos de forma diagonal
  5.  
  6.    for (haciaAdelante = 0; haciaAdelante < 11; haciaAdelante++)
  7.    {
  8.        z [haciaAdelante] = x[haciaAdelante] + y[haciaAtras];
  9.        haciaAtras--;
  10.    }

Lo que yo cambiaria es al rellenar los arreglos y checar no repetidos, lo haria de la forma siguiente:

Código
  1. for(int x = 0; x < 10; x++)
  2. {
  3. do{
  4. existe = false;
  5. arr1[x] = (1 + rand() % 15);
  6. for(int i = 0; i < x; i++)
  7. if(arr1[x] == arr1[i])
  8. existe = true;
  9. }while(existe);
  10.  
  11. do{
  12. existe = false;
  13. arr2[x] = (1 + rand() % 15);
  14. for(int i = 0; i < x; i++)
  15. if(arr2[x] == arr2[i])
  16. existe = true;
  17. }while(existe);
  18. cout << (x+1) << setw(17) << arr1[x] << setw(17) << arr2[x] << endl;
  19. }
  20.  

Aunque pues yo lo hice de 0 a 9, y tu de 1 a 10 hehehe al parecer no usas el index 0 hehehehe


En línea

Runex

Desconectado Desconectado

Mensajes: 192


http://tutogramacion.blogspot.com


Ver Perfil WWW
Re: Código fuente para sumar números enteros aleatorios
« Respuesta #2 en: 3 Abril 2012, 15:43 pm »

Aquí te posteo el code en Python, he visto el tuyo y me he animado a hacer el mio en 10 minutitos antes de volver al instituto.
Código
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import random
  4.  
  5. class arrays:
  6. def __init__(self):
  7. self.arrax()
  8. self.arrat()
  9. self.sumarrays()
  10. # Generador Array1, mientras su longitud sea menor que 10 se genera un aleatorio entre 0 y 15, si el numero no existe
  11. # en la lista se añade, de lo contrario la lista se vacia y se vuelve a iniciar el bucle :)
  12. def arrax(self):
  13. self.array1 = []
  14. while len(self.array1)<10:
  15. self.aleatorio = random.randint(0,15)
  16. if self.aleatorio not in self.array1:
  17. self.array1.append(self.aleatorio)
  18. else:
  19. self.array1 = []
  20. print "---Array 1---"
  21. for self.numerox in self.array1:
  22. print self.numerox
  23. # Generador Array2, mientras su longitud sea menor que 10 se genera un aleatorio entre 0 y 15, si el numero no existe
  24. # en la lista se añade, de lo contrario la lista se vacia y se vuelve a iniciar el bucle :)
  25. def arrat(self):
  26. self.array2 = []
  27. while len(self.array2)<10:
  28. self.aleatorio = random.randint(0,15)
  29. if self.aleatorio not in self.array2:
  30. self.array2.append(self.aleatorio)
  31. else:
  32. self.array2 = []
  33. print "---Array 2---"
  34. for self.numerox in self.array2:
  35. print self.numerox
  36. # Generador Array1, de la suma de arrays, mientras su longitud sea menor que 10
  37. # se inicializa una variable y que indicara la posicion de las listas a sumar, con cada iteracion se eleva 1
  38. def sumarrays(self):
  39. self.sumarrays = []
  40. self.y = 0
  41. while len(self.sumarrays) < 10:
  42. self.suma = self.array1[self.y] + self.array2[self.y]
  43. self.sumarrays.append(self.suma)
  44. self.y +=1
  45. print "---Suma Arrays---"
  46. for self.elemento in self.sumarrays:
  47. print self.elemento
  48. if __name__ == "__main__":
  49. instancia = arrays()
  50. instancia
Por cierto, que año es y que carrera estás haciendo? :)
Un saludo :)
« Última modificación: 3 Abril 2012, 16:16 pm por Runex » En línea

"No renunciaría al bambú.
Nunca renuciaría a ti.
No te compares con otros" "El me dijo:
El bambú tenía un propósito diferente al del
helecho, sin embargo eran necesarios y
hacían del bosque un lugar hermoso".
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Código fuente para sumar números enteros aleatorios
« Respuesta #3 en: 3 Abril 2012, 19:25 pm »

¡Buenas!

Buf... Esa forma de generar numeros aleatorios distintos en un intervalo es muy farragosa. Te propongo esta otra:

Código
  1. #include <stdlib.h>
  2. #include <time.h>
  3.  
  4. #define LONGITUD_INTERVALO_FUENTE 20
  5. #define MIN_FUENTE 1
  6. #define NUMERO_VALORES 15
  7.  
  8. int main(int argc, char *argv[])
  9. {
  10.    int vector_fuente[LONGITUD_INTERVALO_FUENTE];
  11.    int v1[NUMERO_VALORES] , v2[NUMERO_VALORES] , i , indice , aux;
  12.  
  13.    srand(time(NULL));
  14.  
  15.    /* inicializamos la fuente de los datos */
  16.    for(i = 0 ; i < LONGITUD_INTERVALO_FUENTE ; i++)
  17.        vector_fuente[i] = MIN_FUENTE + i;
  18.  
  19.    /* Reordenamos los valores*/
  20.    for(i = 0 ; i < NUMERO_VALORES ; i++)
  21.    {
  22.        aux = vector_fuente[i];
  23.        vector_fuente[i] = vector_fuente[indice = rand() % LONGITUD_INTERVALO_FUENTE];
  24.        vector_fuente[indice] = aux;
  25.    }
  26.  
  27.    /* copiamos los valores en el primer vector */
  28.    for(i = 0 ; i < NUMERO_VALORES ; i++)
  29.        v1[i] = vector_fuente[i];
  30.  
  31.    /* reordenar de nuevo y asignar al segundo vector */
  32. }
  33.  

Aunque parezca mas largo, imagina que tienes que asignar N valores aleatorios distintos en un vector de N posiciones, en este caso, una vez que hayas introducido n valores, la probabilidad de repetir alguno de los valores introducidos es de n/N, es decir, cuanto mayor sea n, mayores posibilidades tendras de repetir alguno de los numeros introducidos, por lo que vuestros bucles se pueden repetir una cantidad de veces considerablemente mas alta de la necesaria. Por ejemplo en un vector de 100 posiciones, una vez introducidos 99 numeros, 99 de cada 100 veces generareis un numero repetido.

Sin embargo, con el metodo que he propuesto, quitando la inicializacion del vector que contiene el origen de los datos, siempre realizareis la misma cantidad de iteraciones, asegurandoos de que nunca se repetiran los valores.

La contrapartida del metodo que he utilizado es que utiliza mas memoria al tener un vector para almacenar todos los posibles datos.

Si quereis luego hago una simulacion con vuestro metodo y dejo las estadisticas para que las veais.

¡Saludos!

PD: Aqui una salida de la simulacion:

Código:
10 valores entre 1 y 16. Media 86.00 iteraciones

Vector resultante:
 11   9   6  14  10   7  15   1   3   4

15 valores entre 1 y 16. Media 358.11 iteraciones

Vector resultante:
 13  15  14   2   5   9   3  10  11   4   1   6   8  12   7

25 valores entre 1 y 51. Media 432.91 iteraciones

Vector resultante:
 46  20  28  40  43  17  22  42  36   7  16  10  47   6  34  18  49  30  33   8
 26  13  27  25  38

50 valores entre 1 y 51. Media 5217.88 iteraciones

Vector resultante:
 39  42  36  25   7  19  23  22  50  41  44  26   2  45  29  18   8  31  28  33
 14   4  20  46  30  48  27  10  47  15  40   6  32  16  24   3  21  43  38  49
 12   9  13  17  11   1   5  35  37  34

Y aqui el codigo fuente que he utilizado para hacerla:

Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4.  
  5. #define RANGO_1 15
  6. #define RANGO_2 50
  7.  
  8. #define MINIMO 1
  9.  
  10. #define NUMERO_VALORES_1 10
  11. #define NUMERO_VALORES_2 15
  12. #define NUMERO_VALORES_3 25
  13. #define NUMERO_VALORES_4 50
  14.  
  15. #define REPETICIONES 2000
  16.  
  17. int main(int argc, char *argv[])
  18. {
  19.    int numero_valores[] = {NUMERO_VALORES_1,NUMERO_VALORES_2,NUMERO_VALORES_3,NUMERO_VALORES_4};
  20.    int rangos[] = {RANGO_1,RANGO_2};
  21.    int v[NUMERO_VALORES_4];
  22.    int total_iteraciones, n_iteraciones , i,j,k, valores_introducidos,valor;
  23.  
  24.    srand(time(NULL));
  25.  
  26.    for(i = 0 ; i < 4 ; i++)
  27.    {
  28.        total_iteraciones = 0;
  29.  
  30.        for(j = 0 ; j < REPETICIONES ; j++)
  31.        {
  32.            n_iteraciones = 0;
  33.  
  34.            valores_introducidos = 0;
  35.  
  36.            while(valores_introducidos != numero_valores[i])
  37.            {
  38.                if(valores_introducidos == 0)
  39.                    v[0] = rand() % rangos[i / 2] + MINIMO;
  40.                else
  41.                {
  42.                    do{
  43.                        valor = rand() % rangos[i / 2] + MINIMO;
  44.  
  45.                        for(k = 0 ; k < valores_introducidos && v[k] != valor ; k++)
  46.                            n_iteraciones++;
  47.  
  48.                        n_iteraciones++;
  49.  
  50.                    }while(k < valores_introducidos);
  51.  
  52.                    v[valores_introducidos] = valor;
  53.                }
  54.  
  55.                valores_introducidos++;
  56.                n_iteraciones++;
  57.            }
  58.  
  59.            total_iteraciones += n_iteraciones;
  60.        }
  61.  
  62.        printf("%d valores entre %d y %d. Media %.2f iteraciones\n\n",
  63.                numero_valores[i], MINIMO , MINIMO + rangos[i / 2], ((float) total_iteraciones) / REPETICIONES);
  64.  
  65.        printf("Vector resultante:\n");
  66.  
  67.        for(k = 0 ; k < numero_valores[i] ; k++)
  68.            printf("%3d ",v[k]);
  69.        printf("\n\n");
  70.    }
  71.  
  72.    return 0;
  73. }
  74.  

¡Saludos de nuevo!
« Última modificación: 3 Abril 2012, 20:22 pm por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Sagrini

Desconectado Desconectado

Mensajes: 107


Ver Perfil WWW
Re: Código fuente para sumar números enteros aleatorios
« Respuesta #4 en: 3 Abril 2012, 20:54 pm »

Wow! Jajaja...

Código
  1. #include <stdio.h>
  2. #define TAM 10
  3. #define RAND 15
  4.  
  5. int main ()
  6. { srand (time (0)); int nums [3][TAM], a, b, x, flag;
  7. for (x=0; x<2; x++) for (a=0; a<TAM; a++)
  8. { do
  9. { nums [x][a]=rand ()%RAND+1; flag=0;
  10. for (b=0; b<a; b++) if (nums [x][b]==nums [x][a]) { flag=1; break; }
  11. } while (flag == 1);
  12. }
  13.  
  14. for (a=0; a<10; a++) nums [2][a]=nums [0][a]+nums[1][9-a];
  15. for (a=0; a<10; a++) printf ("Posición %02d --> %02d + %02d = %02d\n", a+1, nums [0][a], nums [1][9-a], nums [2][a]);
  16. return 0;
  17. }
  18.  
En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Código fuente para sumar números enteros aleatorios
« Respuesta #5 en: 4 Abril 2012, 00:41 am »

¡Buenas!

Sagrini, si prestas atencion a los post anteriores, veras que esa es la forma en la que ellos estaban generando numeros aleatorios (no la misma, pero si basada en busquedas de numeros repetidos). Si miras la tabla que he dejado, veras que es muy ineficiente y cuanto mas crece el tamaño de los datos mas ineficiente se vuelve.

Cuenta tu mismo las iteraciones que esta realizando el codigo que has puesto y luego las que realiza el codigo que he indicado, y comprobaras tu mismo, que estas generando muchisimas mas de las necesarias.

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines