Randomiser une liste<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Je dois randomiser une liste.
randomizeList = Function({Liste}, {Local par défaut},
//Le code va ici
retourner la liste ;
);
liste = {1,2,3,4,5} ;
randomList = randomizeList(liste);
print(randomList); // Résultat attendu quelque chose comme {2,4,5,1,3}
Il existe de nombreuses façons de procéder et aucune mauvaise réponse.J'apprécie tous les commentaires, merci!
Re : Randomiser une listej'aime les lignes droites; le comportement N^2 pour les listes est corrigé !
Re : Randomiser une liste
J'ai augmenté la taille des listes pour aider à mieux différencier, bien que les différences entre les méthodes ne soient pas si grandes. Ce qui est surprenant, ce sont les écarts de temps entre les résultats ci-dessus et ceux-ci. De plus, il semble étrange que la méthode de pmroz soit plus lente avec 100 lignes qu'avec 10 000. Peut-être est-ce dû à la répétition de la tâche de fabrication de la table ?
JMP 13 bêta 8
Mac Intel Core i7 à 2,5 GHz
16 Go de mémoire DDR3 à 1 600 MHz
| N articles | 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 | 7h15 |
Re : Randomiser une listeLe code ci-dessous compare les quatre algorithmes.Les données sont stockées dans un tableau puis représentées graphiquement.Je suis curieux de savoir à quoi cela ressemble dans JMP 13 ?
//version pmroz
pmroz_randomizeList = Fonction ({ une liste } , { Local par défaut } ,
n° = articles ( une liste ) ;
dt = Nouveau tableau ( "" , privé , Ajouter des lignes ( n° ) ,
Nouvelle colonne ( "Données" , Numérique , Continu , Format ( "Meilleur" , 12 ) ,
Définir les valeurs ( une liste ) ) ,
Nouvelle colonne ( "Randomisé" , Numérique , Continu , Format ( "Meilleur" , 12 ) ,
Formule ( Uniforme aléatoire () ) )
) ;
dt << trier ( remplacer le tableau , par ( : Randomisé )) ;
liste_aléatoire = dt : Données << obtenir des valeurs ;
) ;
// Jeff Perkinson 13 juillet 2016 14h00 (en réponse à Peter Mroz)
jeff_randomizeList = Fonction ({ une liste } , { Local par défaut } ,
une liste [ rang ( j ( articles ( une liste ) , 1 , uniforme aléatoire ()))]
) ;
// Fonction de Byron
byron_randomizeList = Fonction ({ une liste } , { Local par défaut } ,
n° = articles ( une liste ) ;
liste rs = mélange aléatoire ( 1 :: n° ) ;
blister = une liste [ liste rs [ 1 :: n° ]] ;
) ;
// Philip Brown 14 juillet 2016 09h50
phil_randomizeListe = Fonction ({ une liste } , { Local par défaut } ,
une liste [ rang ( Répéter ({ uniforme aléatoire ()} , articles ( une liste ) ) )]
) ;
nliste = { 100 , 1000 , 10000 , 20000 , 30000 , 40000 , 50000 , 70000 } ;
dt = nouveau tableau ( "Liste aléatoire" , Ajouter des lignes ( articles ( nliste ) ) ,
Nouvelle colonne ( "N articles" , Numérique , Continu , Format ( "Meilleur" , 12 ) ) ,
Nouvelle colonne ( "pmroz" , Numérique , Continu , Format ( "Meilleur" , 12 ) ) ,
Nouvelle colonne ( "Jeff" , Numérique , Continu , Format ( "Meilleur" , 12 ) ) ,
Nouvelle colonne ( "Byron" , Numérique , Continu , Format ( "Meilleur" , 12 ) ) ,
Nouvelle colonne ( "Phil" , Numérique , Continu , Format ( "Meilleur" , 12 ) )
) ;
pour ( je = 1 , je <= articles ( nliste ) , je ++,
nm = nliste [ je ] ;
dt : N articles [ je ] = nm ;
ma liste = ( comme liste ( 1 :: nm ))[ 1 ] ;
commencer = cocher les secondes () ;
liste aléatoire = pmroz_randomizeList ( ma liste ) ;
écoulé = cocher les secondes () - commencer ;
dt : pmroz [ je ] = écoulé ;
attendez ( 0 ) ;
commencer = cocher les secondes () ;
liste aléatoire = jeff_randomizeList ( ma liste ) ;
écoulé = cocher les secondes () - commencer ;
dt : Jeff [ je ] = écoulé ;
attendez ( 0 ) ;
commencer = cocher les secondes () ;
liste aléatoire = byron_randomizeList ( ma liste ) ;
écoulé = cocher les secondes () - commencer ;
dt : Byron [ je ] = écoulé ;
attendez ( 0 ) ;
commencer = cocher les secondes () ;
liste aléatoire = phil_randomizeListe ( ma liste ) ;
écoulé = cocher les secondes () - commencer ;
dt : Phil [ je ] = écoulé ;
attendez ( 0 ) ;
) ;
dt << Générateur de graphiques ( Afficher le panneau de configuration ( 0 ) ,
Variables ( X ( : N articles ) , Oui ( : pmroz ) , Oui ( : Jeff , Position ( 1 ) ) , Oui ( : Byron , Position ( 1 ) ) ,
Oui ( : Phil , Position ( 1 ) ) ) ,
Éléments ( Points ( X , Oui ( 1 ) , Oui ( 2 ) , Oui ( 3 ) , Oui ( 4 ) , Légende ( 1 ) , Gigue ( 1 ) ) ,
Plus lisse ( X , Oui ( 1 ) , Oui ( 2 ) , Oui ( 3 ) , Oui ( 4 ) , Légende ( 2 ) ) )
) ;
Re : Randomiser une listeLes tables privées sont très utiles, mais soyez prudent, car chaque table contient moins de mémoire ; ils sont plus difficiles à suivre.Vous pouvez rapidement prendre beaucoup de mémoire en créant et en ouvrant des tables privées et c'est facile de les manquer puisqu'elles n'ont pas de fenêtre physique (comme dans mon exemple ci-dessus).
Cependant, ils peuvent vous faire gagner beaucoup de temps puisque vous n'avez pas besoin de les fermer, vous pouvez simplement réaffecter la variable qui les contient (ce que j'avais prévu ci-dessus, mais je n'avais pas réalisé que votre fonction avait un {Default Local} -- DOH !).
Extrait du guide de script :
Tableaux de données privées
Masquez complètement la table de données en incluant l'argument privé :
dt = Open( "$SAMPLE_DATA/Big Class.jmp", "privé" );
Rendre une table privée peut éviter des problèmes de mémoire lorsqu'un script ouvre et ferme plusieurs
les tables. Les tables de données privées n'ont pas de fenêtre physique, donc moins de mémoire est requise qu'avec
tableaux invisibles.
Comme pour les tables invisibles, les analyses exécutées sur une table de données privée sont liées à la table.
Pour éviter de perdre une table de données privée, vous devez lui attribuer une référence comme indiqué dans le précédent
exemple. Sinon, JMP supprime immédiatement la table de données privées de la mémoire.
Des utilisations supplémentaires de la table plus tard dans le script génèrent des erreurs.
Re : Randomiser une listeEncore une autre façon....
// Philip Brown 14 juillet 2016 09h50
phil_randomizeList = Fonction ({aList},{Local par défaut},
une liste[ rang ( Répéter ({ uniforme aléatoire ()}, articles (une liste) ) )]
);
Je ne pense pas que ce soit plus rapide que la fonction intégrée Random Shuffle, mais j'ai toujours aimé utiliser Repeat({}, n) pour générer des listes pour certaines applications.
Re : Randomiser une listeLe privé le mot-clé est intéressant - le tableau n'apparaît même pas dans la liste des fenêtres.J'imagine que cela économise un peu de mémoire.Je peux l'utiliser dans de nombreux endroits.Merci msharp!
Re : Randomiser une listeDonc, la modification JMP 13 Insert Into résoudra le même problème ?C'est une super nouvelle!
Re : Randomiser une listeLes fonctions de table sont très efficaces pour les grands ensembles de données.L'une des principales raisons est que JMP tire parti de plusieurs cœurs, contrairement à JSL.Cependant, pour les petits ensembles de données, le processus de création de la table ajoute beaucoup de temps système.Pour l'application pour laquelle j'utilise ceci, j'avais en fait quelque chose de similaire à la réponse de PMroz, mais comme mes listes contenaient toutes <1 000 éléments, j'ai remarqué que cela ajoutait pas mal de temps.
Merci tout le monde!
Remarque : Today() n'est précis qu'à la seconde près, Tick Seconds() est précis à 1/60 de seconde et HP TIME() est précis à la microseconde.Bien entendu, tout dépend de votre ordinateur.De plus, pour donner un bon avantage, j'ai changé vos tables en private et supprimé l'instruction close, ce qui accélérera votre script.
Noms par défaut ici ( 1 ) ;
//version pmroz
pmroz_randomizeList = Fonction ({ une liste } , { Local par défaut } ,
dt = Nouveau tableau ( "" , privé ,
Nouvelle colonne ( "Données" , Définir les valeurs ( une liste ) ) ,
Nouvelle colonne ( "Randomisé" , Numérique , Continu , Formule ( Uniforme aléatoire () ) )
) ;
dt << trier ( remplacer le tableau , par ( : Randomisé )) ;
liste_aléatoire = dt : Données << obtenir des valeurs ;
) ;
// Jeff Perkinson 13 juillet 2016 14h00 (en réponse à Peter Mroz)
jeff_randomizeList = Fonction ({ une liste } , { Local par défaut } ,
une liste [ rang ( j ( articles ( une liste ) , 1 , uniforme aléatoire ()))]
) ;
// Fonction de Byron
byron_randomizeList = Fonction ({ une liste } , { Local par défaut } ,
n° = articles ( une liste ) ;
liste rs = mélange aléatoire ( 1 :: n° ) ;
blister = une liste [ liste rs [ 1 :: n° ]] ;
) ;
nm = 100 ; // Définit le nombre d'éléments de la liste
imax = 100 ; // Définir le nombre d'itérations
ma liste = ( comme liste ( 1 :: nm ))[ 1 ] ;
commencer = TEMPS HP () ;
Pour ( je = 1 , je <= imax , je ++,
liste aléatoire = pmroz_randomizeList ( ma liste ) ;
) ;
écoulé = TEMPS HP () - commencer ;
imprimer ( " pmroz : " || carboniser ( écoulé )) ;
attendez ( 0 ) ;
commencer = TEMPS HP () ;
Pour ( je = 1 , je <= imax , je ++,
liste aléatoire = jeff_randomizeList ( ma liste ) ;
) ;
écoulé = TEMPS HP () - commencer ;
imprimer ( « Jeff : » || carboniser ( écoulé )) ;
attendez ( 0 ) ;
commencer = TEMPS HP () ;
Pour ( je = 1 , je <= imax , je ++,
liste aléatoire = byron_randomizeList ( ma liste ) ;
) ;
écoulé = TEMPS HP () - commencer ;
imprimer ( « Byron : » || carboniser ( écoulé )) ;
attendez ( 0 ) ;
//SORTIR
"pmroz: 121646"
"Jeff : 3990"
"Byron : 3488"
Re : Randomiser une listeles résultats changeront dans JMP 13.
Liste rapide
400 000 ressemble à ceci dans JMP 13 :
"pmroz : 0,533333333332848"
"Jeff : 0,233333333333576"
"Byron : 0,216666666667152"
Re : Randomiser une listeTrès intéressant.Ma solution de table semblait une sorte de force brute, mais elle surpasse les deux autres fonctions lorsque le nombre d'éléments de la liste dépasse 15 000. Les fonctions de table sont apparemment très efficaces.

Voici le code que j'ai utilisé :
//version pmroz
pmroz_randomizeList = Fonction ({ une liste } , { Local par défaut } ,
n° = articles ( une liste ) ;
dt = Nouveau tableau ( "" , invisible , Ajouter des lignes ( n° ) ,
Nouvelle colonne ( "Données" , Numérique , Continu , Format ( "Meilleur" , 12 ) ,
Définir les valeurs ( une liste ) ) ,
Nouvelle colonne ( "Randomisé" , Numérique , Continu , Format ( "Meilleur" , 12 ) ,
Formule ( Uniforme aléatoire () ) )
) ;
dt << trier ( remplacer le tableau , par ( : Randomisé )) ;
liste_aléatoire = dt : Données << obtenir des valeurs ;
fermer ( dt , nosave ) ;
liste_aléatoire ;
) ;
// Jeff Perkinson 13 juillet 2016 14h00 (en réponse à Peter Mroz)
jeff_randomizeList = Fonction ({ une liste } , { Local par défaut } ,
une liste [ rang ( j ( articles ( une liste ) , 1 , uniforme aléatoire ()))]
) ;
// Fonction de Byron
byron_randomizeList = Fonction ({ une liste } , { Local par défaut } ,
n° = articles ( une liste ) ;
liste rs = mélange aléatoire ( 1 :: n° ) ;
blister = une liste [ liste rs [ 1 :: n° ]] ;
) ;
nm = 4000 ; // Définit le nombre d'éléments de la liste
ma liste = ( comme liste ( 1 :: nm ))[ 1 ] ;
commencer = aujourd'hui () ;
liste aléatoire = pmroz_randomizeList ( ma liste ) ;
écoulé = aujourd'hui () - commencer ;
imprimer ( " pmroz : " || carboniser ( écoulé )) ;
attendez ( 0 ) ;
ma liste = ( comme liste ( 1 :: nm ))[ 1 ] ;
commencer = aujourd'hui () ;
liste aléatoire = jeff_randomizeList ( ma liste ) ;
écoulé = aujourd'hui () - commencer ;
imprimer ( « Jeff : » || carboniser ( écoulé )) ;
attendez ( 0 ) ;
ma liste = ( comme liste ( 1 :: nm ))[ 1 ] ;
commencer = aujourd'hui () ;
liste aléatoire = byron_randomizeList ( ma liste ) ;
écoulé = aujourd'hui () - commencer ;
imprimer ( « Byron : » || carboniser ( écoulé )) ;
attendez ( 0 ) ;
Re : Randomiser une listeDans JMP, il existe presque toujours au moins trois façons de faire quoi que ce soit.Voici donc le troisième.
En commençant par une liste, créez une liste de nombres mélangés égale au nombre d'éléments dans une liste. Faites ensuite un blist avec les valeurs de alist dans l'ordre de rslist.
alist={a,b,c, 1 , 2 , 3 } ;
liste rs= mélange aléatoire ( 1 :: articles (une liste));
blist=aliste[rslist[ 1 :: articles (une liste)]];
Peu importe si vous utilisez des chiffres, des caractères ou une combinaison dans la liste.
Je suis presque sûr d'avoir eu cette idée dans le livre compagnon JSL
-Byron
Re : Randomiser une listeVoici ma mise en œuvre.
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);Au cas où ce que je fais ici ne serait pas clair
- Le j() la fonction crée une matrice de nombres aléatoires, par exemple [0,04757597646676, 0,738883488578722, 0,935981905087828, 0,0233044682536274, 0,493906983872876]
- Le rang() la fonction renvoie une matrice (par exemple pour ci-dessus : [4, 1, 5, 2, 3] ) qui est utilisé pour renvoyer la liste originale dans un ordre triant les nombres aléatoires.
-Jeff
Re : Randomiser une listeVoici une façon de procéder.J'adorerais voir d'autres approches !
randomizeList = Fonction ({ Liste } , { Local par défaut } ,
n° = articles ( Liste ) ;
dt = Nouveau tableau ( "" , invisible , Ajouter des lignes ( n° ) ,
Nouvelle colonne ( "Données" , Numérique , Continu , Format ( "Meilleur" , 12 ) ,
Définir les valeurs ( Liste ) ) ,
Nouvelle colonne ( "Randomisé" , Numérique , Continu , Format ( "Meilleur" , 12 ) ,
Formule ( Uniforme aléatoire () ) )
) ;
dt << trier ( remplacer le tableau , par ( : Randomisé )) ;
liste_aléatoire = dt : Données << obtenir des valeurs ;
fermer ( dt , nosave ) ;
liste_aléatoire ;
) ;
liste = { 1 , 2 , 3 , 4 , 5 } ;
liste aléatoire = randomizeList ( liste ) ;
imprimer ( liste aléatoire ) ; // Résultat attendu quelque chose comme {2,4,5,1,3}
Re: Randomiser une listeVoici ma mise en œuvre.
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);
Au cas où ce que je fais ici ne serait pas clair,
- La fonction j() crée une matrice de nombres aléatoires, par exemple [0,04757597646676, 0,738883488578722, 0,935981905087828, 0,0233044682536274, 0,493906983872876]
- La fonction rang() renvoie une matrice (par exemple pour ci-dessus : [4, 1, 5, 2, 3] ) qui est utilisée pour renvoyer la liste originale dans un ordre trié des nombres aléatoires.
-Jeff
Re: Randomiser une listeVoici une façon de procéder. J'aimerais beaucoup voir d'autres approches !
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}
Randomiser une listeJ'ai besoin de randomiser une liste.
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}
Il existe de nombreuses façons de procéder et aucune mauvaise réponse. Vos commentaires sont les bienvenus, merci !
Personnalisation de masseRe: Randomiser une listeTrès intéressant. Ma solution avec un tableau semblait un peu brutale, mais elle surpasse les deux autres fonctions lorsque le nombre d'éléments dépasse 15 000. Les fonctions de tableau sont apparemment très efficaces.

Voici le code que j'ai utilisé :
// 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: Randomiser une listeLes fonctions de table sont très efficaces pour les grands ensembles de données. L'une des principales raisons est que JMP exploite les processeurs multicœurs, contrairement à JSL. Cependant, pour les petits ensembles de données, la création de la table engendre une surcharge importante. Dans le cadre de mon application, j'avais une solution similaire à celle de PMroz, mais comme mes listes contenaient toutes moins de 1 000 éléments, j'ai constaté un surcoût significatif en temps d'exécution.
Merci à tous !
Remarque : la fonction Today() est précise à la seconde près, Tick Seconds() au 1/60e de seconde près et HP TIME() à la microseconde près. Bien entendu, ces précisions dépendent de votre ordinateur. Par ailleurs, pour optimiser les performances, j’ai rendu vos tables privées et supprimé l’instruction close, ce qui accélérera l’exécution de votre 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"