Aleatorizar una lista<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Necesito aleatorizar una lista.
randomizeList = Función ({Lista}, {Local predeterminado},
//El codigo va aqui
Lista de retorno;
);
lista = {1,2,3,4,5};
randomList = randomizeList(lista);
imprimir (lista aleatoria); //Salida esperada algo así como {2,4,5,1,3}
Hay muchas maneras de hacer esto y ninguna respuesta incorrecta.Agradezco cualquier comentario, gracias!
Re: Aleatorizar una listaama las líneas rectas; ¡el comportamiento N^2 para las listas está arreglado!
Re: Aleatorizar una lista
Aumenté los tamaños de las listas para ayudar a diferenciar un poco mejor, aunque las diferencias entre los métodos no son tan grandes. Lo sorprendente son las diferencias de tiempo entre los resultados anteriores y estos. Además, parece extraño que el método de pmroz sea más lento con 100 filas que con 10000. ¿Quizás se deba a repetir la tarea de hacer la mesa?
JMP 13 beta 8
Intel Core i7 de 2,5 GHz para Mac
DDR3 de 16 GB a 1600 MHz
| N artículos | pmroz | jeff | Byron | phil |
| 100 | 0.1833333333 | 0 | 0 | 0 |
| 1000 | 0 | 0 | 0 | 0 |
| 10000 | 0.0166666667 | 0 | 0 | 0 |
| 50000 | 0.05 | 0.0166666667 | 0 | 0.0166666667 |
| 100000 | 0.1 | 0.0333333333 | 0.0333333333 | 0.0333333333 |
| 500000 | 0.6 | 0.2333333333 | 0.1666666667 | 0.2666666667 |
| 1000000 | 1.3166666667 | 0.5166666667 | 0.3666666667 | 0.5666666667 |
| 10000000 | 17.633333333 | 6.1833333333 | 4.3 | 7.15 |
Re: Aleatorizar una listaEl siguiente código compara los cuatro algoritmos.Los datos se almacenan en una tabla y luego se grafican.Tengo curiosidad por saber cómo se ve esto en JMP 13.
// versión pmroz
pmroz_randomizeList = Función ({ una lista } , { Local predeterminado } ,
no. = artículos ( una lista ) ;
dt = Nueva tabla ( "" , privado , Agregar filas ( no. ) ,
Nueva columna ( "Datos" , Numérico , Continuo , Formato ( "Mejor" , 12 ) ,
Establecer valores ( una lista ) ) ,
Nueva columna ( "Aleatorizado" , Numérico , Continuo , Formato ( "Mejor" , 12 ) ,
Fórmula ( Uniforme aleatorio () ) )
) ;
dt << clasificar ( reemplazar mesa , por ( : Aleatorizado )) ;
lista_aleatoria = dt : Datos << obtener valores ;
) ;
// Jeff Perkinson 13 de julio de 2016 14:00 (en respuesta a Peter Mroz)
jeff_randomizeLista = Función ({ una lista } , { Local predeterminado } ,
una lista [ rango ( j ( artículos ( una lista ) , 1 , uniforme al azar ()))]
) ;
// función de Byron
byron_randomizeLista = Función ({ una lista } , { Local predeterminado } ,
no. = artículos ( una lista ) ;
rslist = barajar al azar ( 1 :: no. ) ;
lista = una lista [ rslist [ 1 :: no. ]] ;
) ;
// Philip Brown 14 de julio de 2016 9:50 a. m.
phil_randomizeLista = Función ({ una lista } , { Local predeterminado } ,
una lista [ rango ( Repetir ({ uniforme al azar ()} , artículos ( una lista ) ) )]
) ;
lista = { 100 , 1000 , 10000 , 20000 , 30000 , 40000 , 50000 , 70000 } ;
dt = mesa nueva ( "Lista aleatoria" , Agregar filas ( artículos ( lista ) ) ,
Nueva columna ( "N elementos" , Numérico , Continuo , Formato ( "Mejor" , 12 ) ) ,
Nueva columna ( "pmroz" , Numérico , Continuo , Formato ( "Mejor" , 12 ) ) ,
Nueva columna ( "Jeff" , Numérico , Continuo , Formato ( "Mejor" , 12 ) ) ,
Nueva columna ( "Byron" , Numérico , Continuo , Formato ( "Mejor" , 12 ) ) ,
Nueva columna ( "Phil" , Numérico , Continuo , Formato ( "Mejor" , 12 ) )
) ;
por ( i = 1 , i <= artículos ( lista ) , i ++,
Nuevo Méjico = lista [ i ] ;
dt : N elementos [ i ] = Nuevo Méjico ;
mi lista = ( como lista ( 1 :: Nuevo Méjico ))[ 1 ] ;
comienzo = marcar segundos () ;
lista aleatoria = pmroz_randomizeList ( mi lista ) ;
transcurrido = marcar segundos () - comienzo ;
dt : pmroz [ i ] = transcurrido ;
Espere ( 0 ) ;
comienzo = marcar segundos () ;
lista aleatoria = jeff_randomizeLista ( mi lista ) ;
transcurrido = marcar segundos () - comienzo ;
dt : jeff [ i ] = transcurrido ;
Espere ( 0 ) ;
comienzo = marcar segundos () ;
lista aleatoria = byron_randomizeLista ( mi lista ) ;
transcurrido = marcar segundos () - comienzo ;
dt : Byron [ i ] = transcurrido ;
Espere ( 0 ) ;
comienzo = marcar segundos () ;
lista aleatoria = phil_randomizeLista ( mi lista ) ;
transcurrido = marcar segundos () - comienzo ;
dt : phil [ i ] = transcurrido ;
Espere ( 0 ) ;
) ;
dt << Generador de gráficos ( Mostrar panel de control ( 0 ) ,
Variables ( X ( : N artículos ) , Y ( : pmroz ) , Y ( : jeff , Posición ( 1 ) ) , Y ( : Byron , Posición ( 1 ) ) ,
Y ( : phil , Posición ( 1 ) ) ) ,
Elementos ( Puntos ( X , Y ( 1 ) , Y ( 2 ) , Y ( 3 ) , Y ( 4 ) , Leyenda ( 1 ) , Estar nervioso ( 1 ) ) ,
más suave ( X , Y ( 1 ) , Y ( 2 ) , Y ( 3 ) , Y ( 4 ) , Leyenda ( 2 ) ) )
) ;
Re: Aleatorizar una listaLas tablas privadas son muy útiles, pero tenga cuidado, ya que cada tabla tiene menos memoria; son más difíciles de rastrear.Puede ocupar mucha memoria rápidamente al crear y abrir tablas privadas y es fácil pasarlo por alto ya que no tienen una ventana física (como en mi ejemplo anterior).
Sin embargo, pueden ahorrarle mucho tiempo ya que no necesita cerrarlos, simplemente puede reasignar la variable que los contiene (que es lo que pretendía anteriormente pero no me di cuenta de que su función tenía un {Default Local} - ¡DOH!).
De la guía de secuencias de comandos:
Tablas de datos privados
Oculte completamente la tabla de datos de la vista al incluir el argumento privado:
dt = Abrir( "$SAMPLE_DATA/Big Class.jmp", "privado" );
Hacer que una tabla sea privada puede evitar problemas de memoria cuando un script abre y cierra muchas
mesas. Las tablas de datos privados no tienen ventana física, por lo que se requiere menos memoria que con
mesas invisibles.
Al igual que con las tablas invisibles, los análisis que se ejecutan en una tabla de datos privados están vinculados a la tabla.
Para evitar perder una tabla de datos privados, debe asignarle una referencia como se muestra en el anterior
ejemplo. De lo contrario, JMP elimina inmediatamente la tabla de datos privados de la memoria.
Los usos adicionales de la tabla más adelante en el script generan errores.
Re: Aleatorizar una listaOtra forma mas....
// Philip Brown 14 de julio de 2016 9:50 a. m.
phil_randomizeList = Función ({aList}, {Local predeterminado},
una lista[ rango ( Repetir ({ uniforme al azar ()}, artículos (una lista) ) )]
);
No creo que esto sea más rápido que la función Random Shuffle incorporada, pero siempre me ha gustado usar Repetir ({}, n) para generar listas para ciertas aplicaciones.
Re: Aleatorizar una listalos privado la palabra clave es interesante: la tabla ni siquiera aparece en la lista de ventanas.Me imagino que ahorra un poco de memoria.Puedo usar esto en un montón de lugares.Gracias msharp!
Re: Aleatorizar una listaEntonces, ¿el cambio Insertar en JMP 13 solucionará el mismo problema?¡Esta es una gran noticia!
Re: Aleatorizar una listaLas funciones de tabla son muy eficientes para grandes conjuntos de datos.Una de las razones principales es que JMP aprovecha múltiples núcleos mientras que JSL no.Sin embargo, para conjuntos de datos pequeños, el proceso de creación de la tabla agrega muchos gastos generales.Para la aplicación para la que estoy usando esto, en realidad tenía algo similar a la respuesta de PMroz, pero como mis listas tenían <1000 elementos, noté que estaba agregando bastante tiempo.
¡Gracias a todos!
Nota: Today() solo tiene una precisión de segundos, Tick Seconds() tiene una precisión de 1/60 de segundo y HP TIME() tiene una precisión de microsegundos.Por supuesto, todo esto depende de tu computadora.Además, para dar una ventaja justa, cambié sus tablas a privadas y eliminé la declaración de cierre, lo que acelerará su secuencia de comandos.
Nombres predeterminados aquí ( 1 ) ;
// versión pmroz
pmroz_randomizeList = Función ({ una lista } , { Local predeterminado } ,
dt = Nueva tabla ( "" , privado ,
Nueva columna ( "Datos" , Establecer valores ( una lista ) ) ,
Nueva columna ( "Aleatorizado" , Numérico , Continuo , Fórmula ( Uniforme aleatorio () ) )
) ;
dt << clasificar ( reemplazar mesa , por ( : Aleatorizado )) ;
lista_aleatoria = dt : Datos << obtener valores ;
) ;
// Jeff Perkinson 13 de julio de 2016 14:00 (en respuesta a Peter Mroz)
jeff_randomizeLista = Función ({ una lista } , { Local predeterminado } ,
una lista [ rango ( j ( artículos ( una lista ) , 1 , uniforme al azar ()))]
) ;
// función de Byron
byron_randomizeLista = Función ({ una lista } , { Local predeterminado } ,
no. = artículos ( una lista ) ;
rslist = barajar al azar ( 1 :: no. ) ;
lista = una lista [ rslist [ 1 :: no. ]] ;
) ;
Nuevo Méjico = 100 ; // Establecer el número de elementos de la lista
imáx = 100 ; // Establecer el número de iteraciones
mi lista = ( como lista ( 1 :: Nuevo Méjico ))[ 1 ] ;
comienzo = TIEMPO HP () ;
Para ( i = 1 , i <= imáx , i ++,
lista aleatoria = pmroz_randomizeList ( mi lista ) ;
) ;
transcurrido = TIEMPO HP () - comienzo ;
impresión ( "pmroz: " || carbonizarse ( transcurrido )) ;
Espere ( 0 ) ;
comienzo = TIEMPO HP () ;
Para ( i = 1 , i <= imáx , i ++,
lista aleatoria = jeff_randomizeLista ( mi lista ) ;
) ;
transcurrido = TIEMPO HP () - comienzo ;
impresión ( "Jef:" || carbonizarse ( transcurrido )) ;
Espere ( 0 ) ;
comienzo = TIEMPO HP () ;
Para ( i = 1 , i <= imáx , i ++,
lista aleatoria = byron_randomizeLista ( mi lista ) ;
) ;
transcurrido = TIEMPO HP () - comienzo ;
impresión ( "Byron:" || carbonizarse ( transcurrido )) ;
Espere ( 0 ) ;
//PRODUCCIÓN
"pmroz: 121646"
"Jeff: 3990"
"Byron: 3488"
Re: Aleatorizar una listalos resultados cambiarán en JMP 13.
Lista rápida
400,000 se ve así en JMP 13:
"pmroz: 0.533333333332848"
"Jeff: 0.233333333333576"
"Byron: 0.216666666667152"
Re: Aleatorizar una listaMuy interesante.Mi solución de tabla parecía una especie de fuerza bruta, pero supera a las otras dos funciones cuando la cantidad de elementos de la lista supera los 15,000. Aparentemente, las funciones de tabla son muy eficientes.

Aquí está el código que usé:
// versión pmroz
pmroz_randomizeList = Función ({ una lista } , { Local predeterminado } ,
no. = artículos ( una lista ) ;
dt = Nueva tabla ( "" , invisible , Agregar filas ( no. ) ,
Nueva columna ( "Datos" , Numérico , Continuo , Formato ( "Mejor" , 12 ) ,
Establecer valores ( una lista ) ) ,
Nueva columna ( "Aleatorizado" , Numérico , Continuo , Formato ( "Mejor" , 12 ) ,
Fórmula ( Uniforme aleatorio () ) )
) ;
dt << clasificar ( reemplazar mesa , por ( : Aleatorizado )) ;
lista_aleatoria = dt : Datos << obtener valores ;
cerca ( dt , no guardar ) ;
lista_aleatoria ;
) ;
// Jeff Perkinson 13 de julio de 2016 14:00 (en respuesta a Peter Mroz)
jeff_randomizeLista = Función ({ una lista } , { Local predeterminado } ,
una lista [ rango ( j ( artículos ( una lista ) , 1 , uniforme al azar ()))]
) ;
// función de Byron
byron_randomizeLista = Función ({ una lista } , { Local predeterminado } ,
no. = artículos ( una lista ) ;
rslist = barajar al azar ( 1 :: no. ) ;
lista = una lista [ rslist [ 1 :: no. ]] ;
) ;
Nuevo Méjico = 4000 ; // Establecer el número de elementos de la lista
mi lista = ( como lista ( 1 :: Nuevo Méjico ))[ 1 ] ;
comienzo = Este Dia () ;
lista aleatoria = pmroz_randomizeList ( mi lista ) ;
transcurrido = Este Dia () - comienzo ;
impresión ( "pmroz: " || carbonizarse ( transcurrido )) ;
Espere ( 0 ) ;
mi lista = ( como lista ( 1 :: Nuevo Méjico ))[ 1 ] ;
comienzo = Este Dia () ;
lista aleatoria = jeff_randomizeLista ( mi lista ) ;
transcurrido = Este Dia () - comienzo ;
impresión ( "Jef:" || carbonizarse ( transcurrido )) ;
Espere ( 0 ) ;
mi lista = ( como lista ( 1 :: Nuevo Méjico ))[ 1 ] ;
comienzo = Este Dia () ;
lista aleatoria = byron_randomizeLista ( mi lista ) ;
transcurrido = Este Dia () - comienzo ;
impresión ( "Byron:" || carbonizarse ( transcurrido )) ;
Espere ( 0 ) ;
Re: Aleatorizar una listaEn JMP casi siempre hay al menos tres formas de hacer cualquier cosa.Así que aquí está el tercero.
Comenzando con alista, haga una lista de números barajados igual al número de elementos en alista. Luego haga blist con los valores de alist en el orden de rslist.
lista={a,b,c, 1 , 2 , 3 };
rslist= barajar al azar ( 1 :: artículos (una lista));
blist=alist[rslist[ 1 :: artículos (una lista)]];
No importa si está utilizando números, caracteres o una combinación en la lista.
Estoy bastante seguro de que obtuve esta idea del libro complementario de JSL
-Byron
Re: Aleatorizar una listaAquí está mi implementación.
randomizeList =Function({List},{Default Local}, //Code goes here List[rank(j(nitems(List), 1, random uniform()))]);list = {100,200,300,400,500};randomList = randomizeList(list);print(randomList);En caso de que no esté claro lo que estoy haciendo aquí
- los j() función crea una matriz de números aleatorios, por ejemplo [0.04757597646676, 0.738883488578722, 0.935981905087828, 0.0233044682536274, 0.493906983872876]
- los rango() función devuelve una matriz (por ejemplo, para arriba: [4, 1, 5, 2, 3] ) que se utiliza para devolver la lista original en un orden ordenado de números aleatorios.
-Jeff
Re: Aleatorizar una listaEsta es una forma de hacerlo.¡Me encantaría ver otros enfoques!
aleatorizarLista = Función ({ Lista } , { Local predeterminado } ,
no. = artículos ( Lista ) ;
dt = Nueva tabla ( "" , invisible , Agregar filas ( no. ) ,
Nueva columna ( "Datos" , Numérico , Continuo , Formato ( "Mejor" , 12 ) ,
Establecer valores ( Lista ) ) ,
Nueva columna ( "Aleatorizado" , Numérico , Continuo , Formato ( "Mejor" , 12 ) ,
Fórmula ( Uniforme aleatorio () ) )
) ;
dt << clasificar ( reemplazar mesa , por ( : Aleatorizado )) ;
lista_aleatoria = dt : Datos << obtener valores ;
cerca ( dt , no guardar ) ;
lista_aleatoria ;
) ;
lista = { 1 , 2 , 3 , 4 , 5 } ;
lista aleatoria = aleatorizarLista ( lista ) ;
impresión ( lista aleatoria ) ; //Salida esperada algo así como {2,4,5,1,3}