Aleatorizar una lista<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Necesito aleatorizar una lista.
lista aleatoria = Función ({Lista}, {Local predeterminado},
//El código va aquí
Lista de retorno;
);
lista = {1,2,3,4,5};
ListaAleatoria = ListaAleatoria(lista);
imprimir(Listaaleatoria); //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 listaamo las líneas rectas; ¡El comportamiento N^2 para listas está arreglado!
Re: Aleatorizar una lista
Aumenté el tamaño de las listas para ayudar a diferenciar un poco mejor, aunque las diferencias entre métodos no son tan grandes. Lo sorprendente son las diferencias temporales 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 sea por repetir la tarea de hacer la mesa?
JMP 13 beta 8
Mac Intel Core i7 de 2,5 GHz
DDR3 de 16GB a 1600MHz
| N artículos | pmroz | jeff | byron | filo |
| 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 representan gráficamente.Tengo curiosidad por saber cómo se ve esto en JMP 13.
// versión pmroz
pmroz_randomizeList = Función ({ una lista } , { Local predeterminado } ,
n° = nitems ( una lista ) ;
dt = Nueva mesa ( "" , privado , Agregar filas ( n° ) ,
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 2:00 p. m. (en respuesta a Peter Mroz)
jeff_randomizeList = Función ({ una lista } , { Local predeterminado } ,
una lista [ rango ( j ( nitems ( una lista ) , 1 , uniforme aleatorio ()))]
) ;
// función de Byron
byron_randomizeList = Función ({ una lista } , { Local predeterminado } ,
n° = nitems ( una lista ) ;
lista de rs = reproducción aleatoria ( 1 :: n° ) ;
ampolla = una lista [ lista de rs [ 1 :: n° ]] ;
) ;
// Philip Brown 14 de julio de 2016 9:50 a.m.
phil_randomizeList = Función ({ una lista } , { Local predeterminado } ,
una lista [ rango ( Repetir ({ uniforme aleatorio ()} , nitems ( una lista ) ) )]
) ;
lista = { 100 , 1000 , 10000 , 20000 , 30000 , 40000 , 50000 , 70000 } ;
dt = nueva mesa ( "Lista aleatoria" , Agregar filas ( nitems ( lista ) ) ,
Nueva columna ( "N artículos" , 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 ( "filo" , Numérico , Continuo , Formato ( "Mejor" , 12 ) )
) ;
para ( i = 1 , i <= nitems ( lista ) , i ++,
Nuevo Méjico = lista [ i ] ;
dt : N artículos [ i ] = Nuevo Méjico ;
mi lista = ( como lista ( 1 :: Nuevo Méjico ))[ 1 ] ;
comenzar = marcar segundos () ;
lista aleatoria = pmroz_randomizeList ( mi lista ) ;
transcurrido = marcar segundos () - comenzar ;
dt : pmroz [ i ] = transcurrido ;
esperar ( 0 ) ;
comenzar = marcar segundos () ;
lista aleatoria = jeff_randomizeList ( mi lista ) ;
transcurrido = marcar segundos () - comenzar ;
dt : jeff [ i ] = transcurrido ;
esperar ( 0 ) ;
comenzar = marcar segundos () ;
lista aleatoria = byron_randomizeList ( mi lista ) ;
transcurrido = marcar segundos () - comenzar ;
dt : byron [ i ] = transcurrido ;
esperar ( 0 ) ;
comenzar = marcar segundos () ;
lista aleatoria = phil_randomizeList ( mi lista ) ;
transcurrido = marcar segundos () - comenzar ;
dt : filo [ i ] = transcurrido ;
esperar ( 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 ( : filo , 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 súper útiles, pero tenga cuidado, ya que cada tabla tiene menos memoria; son más difíciles de rastrear.Puedes consumir mucha memoria rápidamente creando y abriendo tablas privadas y es fácil pasarlas 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 arriba 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 incluyendo 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 privada están vinculados a la tabla.
Para evitar perder una tabla de datos privados, debe asignarle una referencia como se muestra en el ejemplo 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 manera más....
// Philip Brown 14 de julio de 2016 9:50 a.m.
phil_randomizeList = Función ({aList},{Local predeterminado},
una lista[ rango ( Repetir ({ uniforme aleatorio ()}, nitems (una lista) ) )]
);
No creo que esto sea más rápido que la función incorporada Random Shuffle, pero siempre me ha gustado usar Repetir({}, n) para generar listas para ciertas aplicaciones.
Re: Aleatorizar una listaEl privado La palabra clave es interesante: la tabla ni siquiera aparece en la lista de la ventana.Imagino que ahorra un poco de memoria.Puedo usar esto en varios 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 añade 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 darle 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 mesa ( "" , 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 2:00 p. m. (en respuesta a Peter Mroz)
jeff_randomizeList = Función ({ una lista } , { Local predeterminado } ,
una lista [ rango ( j ( nitems ( una lista ) , 1 , uniforme aleatorio ()))]
) ;
// función de Byron
byron_randomizeList = Función ({ una lista } , { Local predeterminado } ,
n° = nitems ( una lista ) ;
lista de rs = reproducción aleatoria ( 1 :: n° ) ;
ampolla = una lista [ lista de rs [ 1 :: n° ]] ;
) ;
Nuevo Méjico = 100 ; // Establece 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 ] ;
comenzar = TIEMPO DE HP () ;
Para ( i = 1 , i <= imáx , i ++,
lista aleatoria = pmroz_randomizeList ( mi lista ) ;
) ;
transcurrido = TIEMPO DE HP () - comenzar ;
imprimir ( "pmroz: " || carbonizarse ( transcurrido )) ;
esperar ( 0 ) ;
comenzar = TIEMPO DE HP () ;
Para ( i = 1 , i <= imáx , i ++,
lista aleatoria = jeff_randomizeList ( mi lista ) ;
) ;
transcurrido = TIEMPO DE HP () - comenzar ;
imprimir ( "Jeff:" || carbonizarse ( transcurrido )) ;
esperar ( 0 ) ;
comenzar = TIEMPO DE HP () ;
Para ( i = 1 , i <= imáx , i ++,
lista aleatoria = byron_randomizeList ( mi lista ) ;
) ;
transcurrido = TIEMPO DE HP () - comenzar ;
imprimir ( "Byron: " || carbonizarse ( transcurrido )) ;
esperar ( 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.La solución de mi tabla parecía una especie de fuerza bruta, pero supera a las otras dos funciones cuando el número de elementos de la lista supera los 15.000. Las funciones de la tabla son aparentemente muy eficientes.

Aquí está el código que utilicé:
// versión pmroz
pmroz_randomizeList = Función ({ una lista } , { Local predeterminado } ,
n° = nitems ( una lista ) ;
dt = Nueva mesa ( "" , invisible , Agregar filas ( n° ) ,
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 , guardar ) ;
lista_aleatoria ;
) ;
// Jeff Perkinson 13 de julio de 2016 2:00 p. m. (en respuesta a Peter Mroz)
jeff_randomizeList = Función ({ una lista } , { Local predeterminado } ,
una lista [ rango ( j ( nitems ( una lista ) , 1 , uniforme aleatorio ()))]
) ;
// función de Byron
byron_randomizeList = Función ({ una lista } , { Local predeterminado } ,
n° = nitems ( una lista ) ;
lista de rs = reproducción aleatoria ( 1 :: n° ) ;
ampolla = una lista [ lista de rs [ 1 :: n° ]] ;
) ;
Nuevo Méjico = 4000 ; // Establece el número de elementos de la lista
mi lista = ( como lista ( 1 :: Nuevo Méjico ))[ 1 ] ;
comenzar = hoy () ;
lista aleatoria = pmroz_randomizeList ( mi lista ) ;
transcurrido = hoy () - comenzar ;
imprimir ( "pmroz: " || carbonizarse ( transcurrido )) ;
esperar ( 0 ) ;
mi lista = ( como lista ( 1 :: Nuevo Méjico ))[ 1 ] ;
comenzar = hoy () ;
lista aleatoria = jeff_randomizeList ( mi lista ) ;
transcurrido = hoy () - comenzar ;
imprimir ( "Jeff:" || carbonizarse ( transcurrido )) ;
esperar ( 0 ) ;
mi lista = ( como lista ( 1 :: Nuevo Méjico ))[ 1 ] ;
comenzar = hoy () ;
lista aleatoria = byron_randomizeList ( mi lista ) ;
transcurrido = hoy () - comenzar ;
imprimir ( "Byron: " || carbonizarse ( transcurrido )) ;
esperar ( 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 alist, haga una lista de números mezclados igual a la cantidad de elementos en alist. Luego haga una lista con los valores de alist en el orden de rslist.
alista={a,b,c, 1 , 2 , 3 };
listar= reproducción aleatoria ( 1 :: nitems (una lista));
blist=alista[rslista[ 1 :: nitems (una lista)]];
No importa si utiliza números, caracteres o una combinación en la lista.
Estoy bastante seguro de que saqué 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 qué estoy haciendo aquí.
- El j() La función crea una matriz de números aleatorios, por ejemplo. [0,04757597646676, 0,738883488578722, 0,935981905087828, 0,0233044682536274, 0,493906983872876]
- El rango() La función devuelve una matriz (por ejemplo, para lo anterior: [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 listaAquí tienes una forma de hacerlo.¡Me encantaría ver otros enfoques!
lista aleatoria = Función ({ Lista } , { Local predeterminado } ,
n° = nitems ( Lista ) ;
dt = Nueva mesa ( "" , invisible , Agregar filas ( n° ) ,
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 , guardar ) ;
lista_aleatoria ;
) ;
lista = { 1 , 2 , 3 , 4 , 5 } ;
lista aleatoria = lista aleatoria ( lista ) ;
imprimir ( lista aleatoria ) ; //Salida esperada algo así como {2,4,5,1,3}
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 qué estoy haciendo aquí
- La función j() crea una matriz de números aleatorios, por ejemplo: [0,04757597646676, 0,738883488578722, 0,935981905087828, 0,0233044682536274, 0.493906983872876]
- La función rango() devuelve una matriz (por ejemplo, para lo anterior: [4, 1, 5, 2, 3] ) que se utiliza para devolver la lista original en un orden ordenado de los números aleatorios.
-Jeff
Re: Aleatorizar una listaAquí tienes una forma de hacerlo. ¡Me encantaría ver otros enfoques!
randomizeList = Function({List}, {Default Local},
nr = nitems(List);
dt = New Table( "", invisible, Add Rows( nr ),
New Column( "Data", Numeric, Continuous, Format( "Best", 12 ),
Set Values( List ) ),
New Column( "Randomized", Numeric, Continuous, Format( "Best", 12 ),
Formula( Random Uniform() ) )
);
dt << sort(replace table, by(:Randomized));
random_list = dt:Data << get values;
close(dt, nosave);
random_list;
);
list = {1,2,3,4,5};
randomList = randomizeList(list);
print(randomList); //Expected output something like {2,4,5,1,3}
Aleatorizar una listaNecesito aleatorizar una lista.
randomizeList = Function({List}, {Default Local},
//Code goes here
return List;
);
list = {1,2,3,4,5};
randomList = randomizeList(list);
print(randomList); //Expected output something like {2,4,5,1,3}
Hay muchas maneras de hacerlo y ninguna es incorrecta. Agradezco cualquier comentario, ¡gracias!
Personalización masivaRe: Aleatorizar una listaMuy interesante. Mi solución de tabla parecía un poco forzada, pero supera a las otras dos funciones cuando el número de elementos de la lista supera los 15 000. Al parecer, las funciones de tabla son muy eficientes.

Aquí está el código que utilicé:
// pmroz version
pmroz_randomizeList = Function({aList}, {Default Local},
nr = nitems(aList);
dt = New Table( "", invisible, Add Rows( nr ),
New Column( "Data", Numeric, Continuous, Format( "Best", 12 ),
Set Values( aList ) ),
New Column( "Randomized", Numeric, Continuous, Format( "Best", 12 ),
Formula( Random Uniform() ) )
);
dt << sort(replace table, by(:Randomized));
random_list = dt:Data << get values;
close(dt, nosave);
random_list;
);
// Jeff Perkinson Jul 13, 2016 2:00 PM (in response to Peter Mroz)
jeff_randomizeList =Function({aList},{Default Local},
aList[rank(j(nitems(aList), 1, random uniform()))]
);
// Byron's function
byron_randomizeList = Function({aList},{Default Local},
nr = nitems(alist);
rslist = random shuffle(1::nr);
blist = alist[rslist[1::nr]];
);
nm = 4000; // Set the number of list elements
my_list = (as list(1::nm))[1];
start = today();
randomList = pmroz_randomizeList(my_list);
elapsed = today() - start;
print("pmroz: " || char(elapsed));
wait(0);
my_list = (as list(1::nm))[1];
start = today();
randomList = jeff_randomizeList(my_list);
elapsed = today() - start;
print("Jeff: " || char(elapsed));
wait(0);
my_list = (as list(1::nm))[1];
start = today();
randomList = byron_randomizeList(my_list);
elapsed = today() - start;
print("Byron: " || char(elapsed));
wait(0);
Re: Aleatorizar una listaLas funciones de tabla son muy eficientes para grandes conjuntos de datos. Una de las principales razones 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 supone una sobrecarga considerable. Para la aplicación que utilizo, obtuve una respuesta similar a la de PMroz, pero como todas mis listas tenían menos de 1000 elementos, noté que me llevaba 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 depende de tu ordenador. Además, para darte una ventaja justa, cambié tus tablas a privadas y eliminé la instrucción close, lo que acelerará tu script.
Names Default to Here(1);
// pmroz version
pmroz_randomizeList = Function({aList}, {Default Local},
dt = New Table( "", private,
New Column( "Data", Set Values( aList ) ),
New Column( "Randomized", Numeric, Continuous, Formula( Random Uniform() ) )
);
dt << sort(replace table, by(:Randomized));
random_list = dt:Data << get values;
);
// Jeff Perkinson Jul 13, 2016 2:00 PM (in response to Peter Mroz)
jeff_randomizeList =Function({aList},{Default Local},
aList[rank(j(nitems(aList), 1, random uniform()))]
);
// Byron's function
byron_randomizeList = Function({aList},{Default Local},
nr = nitems(alist);
rslist = random shuffle(1::nr);
blist = alist[rslist[1::nr]];
);
nm = 100; // Set the number of list elements
imax = 100; // Set number of iterations
my_list = (as list(1::nm))[1];
start = HP TIME();
For(i=1, i<=imax, i++,
randomList = pmroz_randomizeList(my_list);
);
elapsed = HP TIME() - start;
print("pmroz: " || char(elapsed));
wait(0);
start = HP TIME();
For(i=1, i<=imax, i++,
randomList = jeff_randomizeList(my_list);
);
elapsed = HP TIME() - start;
print("Jeff: " || char(elapsed));
wait(0);
start = HP TIME();
For(i=1, i<=imax, i++,
randomList = byron_randomizeList(my_list);
);
elapsed = HP TIME() - start;
print("Byron: " || char(elapsed));
wait(0);
//OUTPUT
"pmroz: 121646"
"Jeff: 3990"
"Byron: 3488"