portafolium set my name for the example yes I from colombia

Iniciado por hxcbps, 22 Mayo 2013, 15:01 PM

0 Miembros y 1 Visitante están viendo este tema.

leosansan

#20
error.

El que abrió el tema le cambio el nombre así que decidí continuar la tarea abriendo otro tema con el nombre inicial actualizado simulacion con matriz bidimensional de 10x10 II

Saluditos!. ... ..


rir3760

Cita de: leosansan en 23 Mayo 2013, 18:45 PMY para que esta aportación no se quede en unas meras disculpas, propongo el método alternativo de generar los números por comparación con los previamente introducidos, sería para sustituir por lo que hay "encima" de estas palabras:

Código (cpp) [Seleccionar]
for( i = 0; i < 100; i++){
   numeros[i]=rand() % 1000+1;
   for( j = i-1; j >=0 ; j--){
      if(numeros[i] == numeros[j]){
         i--;
         break;
      }
   }
}


Aunque seguro que se puede mejorar, la verdad no me termina de convencer el for con el if y el i-- con break
Se pueden evitar ambos cambiando el bucle interno y condicionando el incremento del contador. En C seria mas o menos así:
#define NUM_ELEM  1000

/* ... */

int num[NUM_ELEM];
int i;
int j;

/* ... */

i = 0;
while (i < NUM_ELEM){
   num[i] = rand() % (NUM_ELEM + 1);
   
   for (j = 0; j < i && num[j] != num[i]; j++)
      ;
   
   if (i == j)
      i++;
}


----

Cita de: mr.blood en 24 Mayo 2013, 08:35 AMDejo una alternativa que me parece que es más eficaz. (No recorre toda la matriz para comprobar si existe o no el valor).

Como necesitas tener todos los números del 0-99 es mejor aleatorizar la posición que el valor (Creo). ;)

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

int main()
{
srand(time(NULL));
int matriz[10][10], i, j, x, y;

memset(matriz, 0, sizeof(int)*100);

for(i=0;i<100;i++)
{
x=rand()%10;
y=rand()%10;
if(matriz[x][y]==0)
{
matriz[x][y]=i;
}
else
{
i--;
continue;
}
El problema es: en lugar de preocuparnos por repeticiones en los valores ahora nos preocupamos por repeticiones en las posiciones. Para el caso es lo mismo en el sentido de no evitar la verificación por repetidos.

----

Cita de: leosansan en 24 Mayo 2013, 09:56 AMLamentablemente no tengo compilador en este momento y no puedo comparar, pero creo que siguiendo lo que planteaste de obtener aleatorios de 0 a 100, aunque recuerda que en realidad era "entre" 0 y 10000, el siguiente código podría ser de eficiencia/velocidad semejante.:
Código (cpp) [Seleccionar]
// ...
   
for (i = 0; i < 10; i++, k++){
   for (j = 0; j < 10; j++, k++){
      m[i][j] = n[k];
      cout << m[i][j] << "\t";
   }
   
   k--;
   cout << endl;
}
No es necesaria una variable para calcular la posición del array "n", en su lugar puedes calcular esta en base a los contadores de fila y columna:
// ...
   
for (i = 0; i < 10; i++){
   for (j = 0; j < 10; j++){
      m[i][j] = n[i * 10 + j];
      cout << m[i][j] << "\t";
   }
   
   cout << endl;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

amchacon

Cita de: leosansan en 25 Mayo 2013, 22:08 PM
Me picó la curiosidad e hice una comparativa de tiempos sin impresión, del puro y duro cálculo. Y estos son los resultados:
Hay una cosa muy importante ahí: Las flags de optimización

Normalmente suele haber una buena diferencia de tiempos si le metes un -O, -O2. A veces también puede pasar que le metas -O3 y te tarde hasta más... Estuve haciendo pruebas con un programa de fuerza bruta y me di cuenta que el mejor flag es el -O2.

También miré los códigos ensambladores, el compilador hace mucha optimización por su cuenta y a veces diferentes códigos genera salidas idénticas:

Código (cpp) [Seleccionar]
while(true);

Se traduce:

Código (cpp) [Seleccionar]
L43:
jmp L43


Ahora lo cambiamos a esto:

Código (cpp) [Seleccionar]
bool cosa = true;

while(cosa);


Se traduce:

Código (cpp) [Seleccionar]
L43:
jmp L43


¿Irónico no?
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

leosansan

#23
Cita de: rir3760 en 31 Mayo 2013, 18:14 PM
Se pueden evitar ambos cambiando el bucle interno y condicionando el incremento del contador. En C seria mas o menos así:
#define NUM_ELEM  1000

/* ... */

int num[NUM_ELEM];
int i;
int j;

/* ... */

i = 0;
while (i < NUM_ELEM){
  num[i] = rand() % (NUM_ELEM + 1);
 
  for (j = 0; j < i && num[j] != num[i]; j++)
     ;
 
  if (i == j)
     i++;
}



Tengo que estar a la fuerza de acuerdo contigo, faltaría más. Pero en realidad estas haciendo lo mismo expresado de otra manera, sustituyes un for por un while y aprovechas el segundo for para meter en él la condición. Vamos, más cortito pero más de lo mismo.

Cita de: rir3760 en 31 Mayo 2013, 18:14 PM
El problema es: en lugar de preocuparnos por repeticiones en los valores ahora nos preocupamos por repeticiones en las posiciones. Para el caso es lo mismo en el sentido de no evitar la verificación por repetidos.

Sin duda vuelvo a estar de acuerdo contigo. Pero, cuando menos es curiosa/original la forma de obtener los elementos de la matriz sin repetir y aunque hace una comparación para ver si está o no repetido, sólo hace uso de un for y un else en lugar de mis dos for o tus dos bucles  while-for. Al César lo que es del César, me gustó la "elegancia/originalidad" de mr.blood de obtener los elmentos de la matriz, más inclusive que tu método. Claro que todo es cuestión de gustos.

Cita de: rir3760 en 31 Mayo 2013, 18:14 PM
No es necesaria una variable para calcular la posición del array "n", en su lugar puedes calcular esta en base a los contadores de fila y columna:

Ya, se me escapó el detallit0 y mira que lo he aplicado ya varias veces. Son las miserias de contestar rapidito en el foro, me recuerda las partidas rápidas de ajedrez donde después de terminarlas te das cuenta de las tonterías que has cometido por culpa de ir contra reloj. Hago propósito de enmienda y tomarme más tiempo en contestar. Aunque pensándolo mejor, eso haría perder cierto encanto a la participación en el foro, al menos para mi punto de vista.

Como siempre, gracias por tus aportaciones/puntos de vista, siempre en la misma línea y me refiero al nivelazo que tienes /aportas al foro.

Un fuerte abrazo amigo rir, espero no te tomes a mal mis poquísimas y levísimas discrepancias.