Comunidad de diseño web y desarrollo en internet online

problema con Array

Citar            
MensajeEscrito el 13 Oct 2009 10:20 pm
Hola como están??
tengo un pequeño problema y se los traigo a uds. q tienen años en esto y seguro lo sacan muy rápido. Tengo un array q tiene x cantidad de elementos, lo q necesito es hacer una función q mezcle los items de manera aliatoria y me devuelva el mismo array mezclado. (ej. miArray = [1,2,3], paso por función y miArray = [2,1,3] por ej.)
Estuve leyendo las nuevas funciones de array q hay en el foro, muy bien explicadas por cierto, q me generó algunas ideas por ej. usando foreach (en el ejemplo hacen trasladar cada item a la posición siguiente) pero no logro generarlo.
Desde ya como siempre gracias por su aporte.

Saludos a Eliseo2 y a todo el equipo!

Por Pablokorku

60 de clabLevel



 

firefox
Citar            
MensajeEscrito el 14 Oct 2009 01:43 am
Para que te los mezcle aleatoriamente podrías utilizar el efecto burbuja pero con la pregunta cambiada:

Código :

stop();
var p, q, i;
var V:Array = new Array();
var aux;
   V[1] = 9;
   V[2] = 7;
   V[3] = 8;
   V[4] = 5;
   V[5] = 6;
   V[6] = 3;
   V[7] = 4;
   V[8] = 2;
   V[9] = -5;
   V[10] = 11;
for (p=1; p<=9; p++)
{ //trace(p);
   for (q=p+1; q<=10; q++)
   {
   if (Math.random() >= Math.random())
      {
         aux = V[p];
         V[p] = V[q];
         V[q] = aux;
      }
   }
}
for (i=1; i<11; i++)
{ trace ("vector "+i+": "+V[i]);
}


Normalmente esto se utiliza para ordenar valores, pero aca te lo arme para que te los mezcle :P

Si aca pones:
for (q=p+1; q<=10; q++)
Un nº mayor a 10, más se va a mezclar

Chaus

Por lucasmoyano

Claber

1960 de clabLevel

22 tutoriales

Genero:Masculino  

Developer

firefox
Citar            
MensajeEscrito el 14 Oct 2009 05:16 pm
Gracias por tu respuesta!
veo q funciona perfecto el código, pero la verdad no entiendo bien la lógica de los for, además si le pongo más de 10 en el segundo me salen resultados "undefined" osea ese 10 es el length del array?? Podrías explicarme un poquito más como funciona?
Gracias por tu tiempo!
Saludos!
Pablo.

Por Pablokorku

60 de clabLevel



 

firefox
Citar            
MensajeEscrito el 14 Oct 2009 05:40 pm
El 10 es el length del array, y en le primer for el 9 es el length del array -1
Si pones un nº más grande en el primer for que 9 se mezcla más... pero practicamente no hay diferencia

Por lucasmoyano

Claber

1960 de clabLevel

22 tutoriales

Genero:Masculino  

Developer

firefox
Citar            
MensajeEscrito el 14 Oct 2009 06:20 pm
Hola:

Ufffffff este es uno de los algoritmos mas usados y explicados en instituto o universidad al archi y viejo
conocido ordenamiento por intercambio o burbuja

lo que el algoritmo hace o recorre elementos en forma secuencial el elemento i con el elemento i+1. Entonces
si estan en desorden se intercmbian sus posiciones y se continua hasta recorrer la lita.

la nueva lista a recorrer tiene un tamaño o longitud N-1 elementos, puesto que el numero con el mayor valor te va
a quedar en una posicion correcta (por lo que te mencione anteriormente) ya.

Este proceso se repite con una nueva lista en forma recursiva, hasta cuando no exista ningun cambio el el recorrido
de toda la lista. En este caso esta ordenada, o se continua el proceso hasta cuand oel numero de elemenstos de la lista sea uno.

por consiguiente mi pequeño saltamonetes el numero minimo de comparaciones N-1, en este caso esta ordenada

o sea mi amigo en promedio
(n-1)(n+2)/4=N(2)/4 NOTA: el dos al lado del n es n cuadrado ya.

Un ejemplo:

10 15 25 3 4

Pasos a seguin
10 15 3 4 25
10 3 4 15 25
3 4 10 15 25


ahora te preguntaras porque no hacerlo uno por uno es decir en forma lineal , la razon que si lo hace secuencialmente obtendrias un promedio mas grande de compraciones es decir N(N-1)/2 si

Espero que te quede claro ,en tu caso tambien podrias hacer un itnercalamiento , intercalamiento de un paso
o intercalamiento balanceado googlea y veras que son algoritmos bien interesante ya amigo espero que te quede
claro si no andate a la m...jajaja
broma.

Por xcom

Claber

530 de clabLevel



 

firefox
Citar            
MensajeEscrito el 17 Oct 2009 09:34 am
Si queremos desordenar un array lo más sencillo es un sólo bucle

Código ActionScript :

for (var i:int=0;i<miArray.length;i++){
    var tmp=miArray[i]
    var j:int=Math.float(miArray.length*Math.random())
    miArray[i]=miArray[j]
    miArray[j]=tmp
}

Vamos, durante unas "cuantas veces" y cambiamos el valor de la posición j por el valor de la posición i. No hace falta método de la burbuja ni nada parecido. Si queremos usar algo parecido al método de la burbuja, podríamos usar el método "sort" de un array, en el que la función de comparación fuera una función aleatoria, pero no es necesario

Por Eliseo2

710 de clabLevel



 

msie8
Citar            
MensajeEscrito el 17 Oct 2009 05:09 pm
sip tenes razón Eliseo2, asi es mucho mejor ^^

Por lucasmoyano

Claber

1960 de clabLevel

22 tutoriales

Genero:Masculino  

Developer

firefox
Citar            
MensajeEscrito el 17 Oct 2009 06:02 pm
hola como estás eliseo??
que buena tu idea me encantó! mucho más facil y corto q la burbuja!!! anda de 10 pero corregí 2 errores q a la apurada capaz no viste... ahí va el q anda joya! decía "float" en vez de "floor" y faltaba un paréntesis...
Gracias por tu aporte!
Como siempre genial esta web!

var miArray:Array = [1,2,3,4,5];

for (var i:int=0;i<miArray.length;i++){
var tmp=miArray[i];
var j:int=Math.floor((miArray.length*Math.random()));
miArray[i]=miArray[j]
miArray[j]=tmp
}

trace (miArray);

Por Pablokorku

60 de clabLevel



 

firefox
Citar            
MensajeEscrito el 19 Oct 2009 06:30 am
gracias por la corrección

Por Eliseo2

710 de clabLevel



 

firefox

 

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