Comunidad de diseño web y desarrollo en internet online

Me explican esto =/

Citar            
MensajeEscrito el 24 Mar 2010 07:01 pm
Hola, antier me encontre con este codigo que mezcla numeros, aunque el buen isidoro me dejo otro igual de funcional y mas entendible, me quede con la duda de como este hace lo que hace o_o, primero empieza facil pero despues me voy perdiendo en como logra sacar esos numeros

Código :

function mezclar(m, n) {
   bar = [];
   for (var i = 1; i<=m; i++) {
      bar[i-1] = i;
   }
   for (var i = m-1; i>1; i--) {
      alea = random(i);
      temp = bar[i];
      bar[i] = bar[alea];
      bar[alea] = temp;
   }
   return (bar.splice(0, n));
}
miArray = mezclar(50, 10);
trace(miArray);

El primer for lo entiendo,bar crea 49 elementos que contienen 49 elementos cada uno, algo asi U_U
En el segundo for ya empiezo a dudar que hace, i = 49 creo, y en vez de sumar va a restar, 49-48-47..., ahi ya estoy dudando
alea = random(i) pues eso si lo entiendo, un numero random entre 50
temp = bar[i], aqui ya estoy perdidisimo, el que lo vea, vera -_- que esta todo bien como hasta 40 y luego empieza 40-39-40-37-39-35-34-48-33, asi, numeros ocupan el lugar de los numeros que iban realmente, si hay repeticiones
Y luego ya en bar[i] ya estan desordenados y sin repetirse y digo :0,cuando se hizo ese paso???
Y en el ultimo los vuelve como que acomodar como en el temp = bar[i], (pues si, si bar[alea] es igual a temp) pero, osea si los vuelve a acomodar, porque en el ultimo trace me manda numeros aleatorios y sin repetirse o_0??
Bueno :I espero que se entienda
Gracias U_U

Por el davo29

253 de clabLevel



Genero:Masculino  

Chihuahua :D!

msie8
Citar            
MensajeEscrito el 26 Mar 2010 07:00 am
Bueno, en caso de que alguien quiera contestar, ya segun yo deduje lo que significa cada linea pero no estoy seguro, por si alguien quiere ayudarme U_U

Código :

onMouseDown = function () {
   bar = [];
   //crea un array, bar
   for (var i = 0; i<=50; i++) {
      bar[i] = i;
      //bar va a tener 50elementos
   }
   for (var i = 50; i>1; i--) {
      //al escribir 50-1 me refiere de 50 a 1 50,49,48.... etc
      alea = random(i);
      //esta linea no afecta nada
      //crea numeros aleatorios 50-1            
      temp = bar[i];
      //no afecta
      //temp es ahora bar[i] 50-1, aqui no se altero el valor de bar[i], solo el de temp
      bar[i] = bar[alea];
      //esta linea hace que no se repitan
      //digamos que tenemos 50,49,48,47,46,45, estos elementos van a ser iguales a aleatorio
      //entonces si el primer numero aleatorio es 13, quedaria : 13,49,48,47,46,45
      bar[alea] = temp;
      //los numeros de bar[alea] sustituyen el lugar de los numeros ordenados temp
   }
};

Disculpen mis frasesillas mamonas -__-
Gracias

Por el davo29

253 de clabLevel



Genero:Masculino  

Chihuahua :D!

msie8
Citar            
MensajeEscrito el 26 Mar 2010 08:38 am
Bueno, ya que me he puesto intentaré explicarte también esto (además estoy haciendo un curso de mecanografía y no me viene mal para practicar un poco xD )
De todos modos, no sé de donde habrás sacado esta función pero no está muy optimizada que digamos. La forma de hacerlo es buena, pero en el bucle se desordenan aleatoriamente los 50 elementos del array aunque sólamente quieras extraer 10.
Con estos parámetros no hay mucho problema, pero piensa que si quisieses extraer 10 números aleatorios de entre 10.000 el algoritmo desordenaría los 10.000 elementos para extraer ¡¡ únicamente 10 !!, y la verdad, el rendimiento de la máquina virtual AVM1 no es tan bueno como para hacer este tipo de cosas.

Código ActionScript :

function mezclar(m, n)
{
   //crea un array vacío que contendrá los números
   bar = [];
   //llenamos el array con los números (en este ejemplo, del 1 al 50),
   //luego bar = [ 1, 2, 3, ..., 48, 49, 50 ];
   for (var i = 1; i <= m; i++)
   {
      bar[i - 1] = i;
   }
   //este bucle es el que va a "barajar" los elementos del array.
   for (var i = m - 1; i > 1; i--)
   {
      //El procedimiento consiste en ir eligiendo un elemento aleatorio del array
      //e intercambiar el elemento que está en la posición i por el elemento que está
      //en esa posición aleatoria. Para ello tenemos que usar la variable temporal temp,
      //porque si no al escribir el valor en su nueva posición se borraría el anterior.
      
      //Se elige un número aleatorio entre 0 y el valor de i
      //Por ejemplo, piensa que ha salido el 25
      alea = random(i);
      
      //Guardamos el elemento que está en la posición que indica i,
      //en el primer ciclo del bucle bar[49] = 50, en la variable auxiliar
      //Esto se hace para que al sobre escribir el elemento que está en esa posición,
      //podamos recuperarlo y ponerlo en el lugar que ocupa el número aleatorio
      temp = bar[i];
      
      //sobreescribimos el valor de la posición i con el valor que
      //está en la posición aleatoria, con lo cual tanto el valor
      //de bar[49] como el de bar[25] serían iguales (de hecho, en la
      //primera vuelta, en la que el array bar todavía está ordenado,
      //el valor de ambos sería 26, pero no hay problema por haber sobreescrito
      //bar[49] = 50, porque lo hemos almacenado el la variable auxiliar
      bar[i] = bar[alea];
      
      //finalmente ponemos el valor de la variable auxiliar, es decir 50,
      //en la posición correspondiente al número aleatorio, es decir en bar[25]
      bar[alea] = temp;
      
      //Este bucle se repite para todos los elementos del array,
      //recorriéndolo desde el último elemento hasta el primero
      
      //En resumen, al principio teníamos un array ordenado de números:
      //[ 1, 2, 3, ..., 25, 26, 27, ..., 48, 49, 50 ];
      //Calculamos un número aleatorio, que resultó ser el 25
      //alea = 25
      //Guardamos el número que está en la posición i (49) en una variable auxiliar
      //(ten en cuenta que ese número es el 50 en la primera vuelta,
      //porque los arrays se indexan partiendo de 0)
      //[ 1, 2, 3, ..., 25, 26, 27, ..., 48, 49, 50 ];
      //temp = 50
      //Sobreescribimos el valor de la posición 49 con el valor aleatorio:
      //[ 1, 2, 3, ..., 25, 26, 27, ..., 48, 49, 26 ];
      //temp = 50
      //Finalmente ponemos el valor guardado en la variable temporal
      //en la posición aleatoria:
      //[ 1, 2, 3, ..., 25, 50, 27, ..., 48, 49, 26 ];
      //temp = 50
   }
   //del array desordenado, sólo se devuelven los n primeros elementos.
   //en este caso, de los 50 elementos del array se devuelven los 10 primeros.
   return (bar.splice(0, n));
}
miArray = mezclar(50, 10);
trace(miArray);

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 26 Mar 2010 05:26 pm
=))))))), gracias, y la saque de un post de Teseo de hace como 3 años, pero no planeaba usarla, solo queria saber como rayos hacia eso de combinar numeros asi U_U, de nuevo, gracias gracias :).

Por el davo29

253 de clabLevel



Genero:Masculino  

Chihuahua :D!

msie8
Citar            
MensajeEscrito el 28 Mar 2010 08:02 am
Oye isidoro :I, me contestarias otra pregunta :I, mira despues de dos laargos dias de estudiar ese codigo y lo que dices llegue casi a la conclusion, si lo siguiente que dire es verdad, eso espero U_U
Mira

Código :

bar[alea] = temp;

Se supone que ya tengo mis elementos aleatorios, digamos que salio [5,10,7,35,7,8,3,10], temp es 50,49,48,47,46,45,44,43
A lo que voy y no es problema necesariamente del tema, es del signo = , lo que se hace aqui es:
1. le paso a bar[alea] el valor 50,49,48,47,46,45,44,43.... o
2. bar[alea] va a usar 50,49,48,47,46,45,44,43.... para soltar sus numeritos, 5,49,48,47,46,45,44,43....
5,10,48,47,46,45,44,43....
si es como lo que digo en el numero 2, como le hace o_0, no estoy seguro que en esa parte se haga eso pero tengo idea que si, es que segun yo solo pasaba la informacion de la "expression 2" a la 1(como dice en la ayuda flash U_U)
Graciass =)

Por el davo29

253 de clabLevel



Genero:Masculino  

Chihuahua :D!

msie8
Citar            
MensajeEscrito el 28 Mar 2010 09:47 am
bar[alea] = temp; significa que el elemento del array que está en la posición que nos indique el número aleatorio ahora va a tener el valor de la variable temp.
El proceso consiste en ir eligiendo números aleatorios, e ir intercambiando su posición con el elemento que corresponda según nos vaya indicando el iterador "i" usado en el bucle for. En los pasos anteriores hemos elegido un número aleatorio y hemos hecho que el valor de bar[i] = bar[alea], con lo cual, si el primer número que salió fue 5, tendremos ese valor 5 también donde antes había un 50. Por eso antes de sobreescribir ese 50 lo guardamos en una variable temporal, y después de haber puesto el 5 en la posición del 50, ya podemos poner el valor de temp en la posición del 5 (eso es lo que hace esa línea).
De todos modos, para comprender mejor el código, lo mejor que puedes hacer es usar trace después de cada sentencia, para que veas cúal es el contenido del array y de las variables en cada paso.

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 28 Mar 2010 11:24 pm
:o bien U_U, graciass, :D :)

Por el davo29

253 de clabLevel



Genero:Masculino  

Chihuahua :D!

msie8

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.