Randomisieren Sie eine Liste<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich muss eine Liste randomisieren.
randomizeList = Function({Liste}, {Default Local},
//Code kommt hier rein
Rückgabeliste;
);
Liste = {1,2,3,4,5};
randomList = randomizeList(Liste);
print(zufälligeListe); //Erwartete Ausgabe so etwas wie {2,4,5,1,3}
Es gibt viele Möglichkeiten, dies zu tun und keine falsche Antwort.Ich freue mich über jedes Feedback, danke!
Betreff: Randomisieren Sie eine Listeliebe die geraden Linien; das N^2-Verhalten für Listen ist behoben!
Betreff: Randomisieren Sie eine Liste
Ich habe die Listengröße erhöht, um eine etwas bessere Unterscheidung zu ermöglichen, obwohl die Unterschiede zwischen den Methoden nicht so groß sind. Überraschend sind die Zeitunterschiede zwischen den obigen Ergebnissen und diesen. Außerdem scheint es seltsam, dass die Methode von pmroz mit 100 Zeilen langsamer ist als mit 10000. Vielleicht liegt es an der Wiederholung der Aufgabe, den Tisch zu machen?
JMP 13 Beta 8
Mac 2,5 GHz Intel Core i7
16 GB 1600 MHz DDR3
| N Artikel | 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 |
Betreff: Randomisieren Sie eine ListeDer folgende Code vergleicht die vier Algorithmen.Die Daten werden in einer Tabelle gespeichert und dann grafisch dargestellt.Ich bin neugierig, wie das in JMP 13 aussieht?
// pmroz-Version
pmroz_randomizeList = Funktion ({ eine Liste } , { Standardlokal } ,
Nr = Gegenstände ( eine Liste ) ;
dt = Neue Tabelle ( "" , Privatgelände , Zeilen hinzufügen ( Nr ) ,
Neue Spalte ( "Daten" , Numerisch , Kontinuierlich , Format ( "Am besten" , 12 ) ,
Werte einstellen ( eine Liste ) ) ,
Neue Spalte ( "Zufällig" , Numerisch , Kontinuierlich , Format ( "Am besten" , 12 ) ,
Formel ( Zufällige Uniform () ) )
) ;
dt << Sortieren ( Tisch ersetzen , durch ( : Zufällig )) ;
random_list = dt : Daten << Werte bekommen ;
) ;
// Jeff Perkinson 13. Juli 2016 14:00 (als Antwort auf Peter Mroz)
jeff_randomizeList = Funktion ({ eine Liste } , { Standardlokal } ,
eine Liste [ Rang ( j ( Gegenstände ( eine Liste ) , 1 , zufällige Uniform ()))]
) ;
// Byrons Funktion
byron_randomizeList = Funktion ({ eine Liste } , { Standardlokal } ,
Nr = Gegenstände ( eine Liste ) ;
rslist = zufälliges Mischen ( 1 :: Nr ) ;
Blase = eine Liste [ rslist [ 1 :: Nr ]] ;
) ;
// Philip Brown 14. Juli 2016 9:50 Uhr
phil_randomizeList = Funktion ({ eine Liste } , { Standardlokal } ,
eine Liste [ Rang ( Wiederholen ({ zufällige Uniform ()} , Gegenstände ( eine Liste ) ) )]
) ;
nliste = { 100 , 1000 , 10000 , 20000 , 30000 , 40000 , 50000 , 70000 } ;
dt = neuer Tisch ( "Zufällige Liste" , Zeilen hinzufügen ( Gegenstände ( nliste ) ) ,
Neue Spalte ( "N Artikel" , Numerisch , Kontinuierlich , Format ( "Am besten" , 12 ) ) ,
Neue Spalte ( "pmroz" , Numerisch , Kontinuierlich , Format ( "Am besten" , 12 ) ) ,
Neue Spalte ( "Jeff" , Numerisch , Kontinuierlich , Format ( "Am besten" , 12 ) ) ,
Neue Spalte ( "Byron" , Numerisch , Kontinuierlich , Format ( "Am besten" , 12 ) ) ,
Neue Spalte ( "Phil" , Numerisch , Kontinuierlich , Format ( "Am besten" , 12 ) )
) ;
zum ( ich = 1 , ich <= Gegenstände ( nliste ) , ich ++,
nm = nliste [ ich ] ;
dt : N Artikel [ ich ] = nm ;
meine Liste = ( als Liste ( 1 :: nm ))[ 1 ] ;
Anfang = Sekunden ticken () ;
Zufallsliste = pmroz_randomizeList ( meine Liste ) ;
abgelaufen = Sekunden ticken () - Anfang ;
dt : pmroz [ ich ] = abgelaufen ;
Warten ( 0 ) ;
Anfang = Sekunden ticken () ;
Zufallsliste = jeff_randomizeList ( meine Liste ) ;
abgelaufen = Sekunden ticken () - Anfang ;
dt : Jeff [ ich ] = abgelaufen ;
Warten ( 0 ) ;
Anfang = Sekunden ticken () ;
Zufallsliste = byron_randomizeList ( meine Liste ) ;
abgelaufen = Sekunden ticken () - Anfang ;
dt : Byron [ ich ] = abgelaufen ;
Warten ( 0 ) ;
Anfang = Sekunden ticken () ;
Zufallsliste = phil_randomizeList ( meine Liste ) ;
abgelaufen = Sekunden ticken () - Anfang ;
dt : Phil [ ich ] = abgelaufen ;
Warten ( 0 ) ;
) ;
dt << Graph-Generator ( Systemsteuerung anzeigen ( 0 ) ,
Variablen ( X ( : N Artikel ) , Y ( : pmroz ) , Y ( : Jeff , Position ( 1 ) ) , Y ( : Byron , Position ( 1 ) ) ,
Y ( : Phil , Position ( 1 ) ) ) ,
Elemente ( Punkte ( X , Y ( 1 ) , Y ( 2 ) , Y ( 3 ) , Y ( 4 ) , Legende ( 1 ) , Zittern ( 1 ) ) ,
Glatter ( X , Y ( 1 ) , Y ( 2 ) , Y ( 3 ) , Y ( 4 ) , Legende ( 2 ) ) )
) ;
Betreff: Randomisieren Sie eine ListePrivate Tabellen sind sehr nützlich, aber seien Sie vorsichtig, da jede Tabelle weniger Speicher enthält; sie sind schwerer zu verfolgen.Sie können schnell viel Speicherplatz beanspruchen, indem Sie private Tabellen erstellen und öffnen, und es ist leicht zu übersehen, da sie kein physisches Fenster haben (wie in meinem obigen Beispiel).
Sie können Ihnen jedoch viel Zeit sparen, da Sie sie nicht schließen müssen. Sie können einfach die Variable neu zuweisen, die sie enthält (was ich oben beabsichtigt hatte, aber nicht erkannte, dass Ihre Funktion einen {Default Local} hatte) -- DOH!).
Aus dem Skriptleitfaden:
Private Datentabellen
Blenden Sie die Datentabelle vollständig aus, indem Sie das private Argument einschließen:
dt = Open( "$SAMPLE_DATA/Big Class.jmp", "private" );
Wenn Sie eine Tabelle privat machen, können Sie Speicherprobleme vermeiden, wenn ein Skript viele öffnet und schließt
Tische. Private Datentabellen haben kein physisches Fenster, daher wird weniger Speicher benötigt als mit
unsichtbare Tische.
Wie bei unsichtbaren Tabellen werden Analysen, die auf einer privaten Datentabelle ausgeführt werden, mit der Tabelle verknüpft.
Um den Verlust einer privaten Datentabelle zu vermeiden, müssen Sie ihr eine Referenz zuweisen, wie oben gezeigt
Beispiel. Andernfalls entfernt JMP die private Datentabelle sofort aus dem Speicher.
Zusätzliche Verwendungen der Tabelle später im Skript führen zu Fehlern.
Betreff: Randomisieren Sie eine ListeNoch ein anderer Weg....
// Philip Brown 14. Juli 2016 9:50 Uhr
phil_randomizeList = Funktion ({aList},{Default Local},
eine Liste[ Rang ( Wiederholen ({ zufällige Uniform ()}, Gegenstände (eine Liste) ) )]
);
Ich glaube nicht, dass dies schneller ist als die eingebaute Funktion Random Shuffle, aber ich habe es immer gemocht, Repeat({}, n) zu verwenden, um Listen für bestimmte Anwendungen zu generieren.
Betreff: Randomisieren Sie eine ListeDas Privatgelände Schlüsselwort ist interessant - die Tabelle taucht nicht einmal in der Fensterliste auf.Ich kann mir vorstellen, dass es ein bisschen Speicher spart.Ich kann das an vielen Stellen verwenden.Danke MSharp!
Betreff: Randomisieren Sie eine ListeAlso behebt die JMP 13 Insert In-Änderung das gleiche Problem?Das sind gute Nachrichten!
Betreff: Randomisieren Sie eine ListeTabellenfunktionen sind für große Datensätze sehr effizient.Einer der Hauptgründe dafür ist, dass JMP mehrere Kerne nutzt, JSL jedoch nicht.Bei kleinen Datensätzen fügt der Prozess der Tabellenerstellung jedoch viel Overhead hinzu.Für die Anwendung, für die ich dies verwende, hatte ich tatsächlich etwas Ähnliches wie die Antwort von PMroz, aber da meine Listen alle <1000 Elemente waren, bemerkte ich, dass es ziemlich viel Zeit hinzufügte.
Danke an alle!
Hinweis: Today() ist nur auf die Sekunde genau, Tick Seconds() ist auf 1/60 Sekunde genau und HP TIME() ist auf die Mikrosekunde genau.Dies hängt natürlich alles von Ihrem Computer ab.Außerdem habe ich, um einen fairen Vorteil zu verschaffen, Ihre Tabellen auf privat geändert und die close-Anweisung entfernt, was Ihr Skript beschleunigen wird.
Namen sind standardmäßig hier ( 1 ) ;
// pmroz-Version
pmroz_randomizeList = Funktion ({ eine Liste } , { Standardlokal } ,
dt = Neue Tabelle ( "" , Privatgelände ,
Neue Spalte ( "Daten" , Werte einstellen ( eine Liste ) ) ,
Neue Spalte ( "Zufällig" , Numerisch , Kontinuierlich , Formel ( Zufällige Uniform () ) )
) ;
dt << Sortieren ( Tisch ersetzen , durch ( : Zufällig )) ;
random_list = dt : Daten << Werte bekommen ;
) ;
// Jeff Perkinson 13. Juli 2016 14:00 (als Antwort auf Peter Mroz)
jeff_randomizeList = Funktion ({ eine Liste } , { Standardlokal } ,
eine Liste [ Rang ( j ( Gegenstände ( eine Liste ) , 1 , zufällige Uniform ()))]
) ;
// Byrons Funktion
byron_randomizeList = Funktion ({ eine Liste } , { Standardlokal } ,
Nr = Gegenstände ( eine Liste ) ;
rslist = zufälliges Mischen ( 1 :: Nr ) ;
Blase = eine Liste [ rslist [ 1 :: Nr ]] ;
) ;
nm = 100 ; // Setze die Anzahl der Listenelemente
imax = 100 ; // Anzahl der Iterationen festlegen
meine Liste = ( als Liste ( 1 :: nm ))[ 1 ] ;
Anfang = PS-ZEIT () ;
Zum ( ich = 1 , ich <= imax , ich ++,
Zufallsliste = pmroz_randomizeList ( meine Liste ) ;
) ;
abgelaufen = PS-ZEIT () - Anfang ;
drucken ( "pmroz:" || verkohlen ( abgelaufen )) ;
Warten ( 0 ) ;
Anfang = PS-ZEIT () ;
Zum ( ich = 1 , ich <= imax , ich ++,
Zufallsliste = jeff_randomizeList ( meine Liste ) ;
) ;
abgelaufen = PS-ZEIT () - Anfang ;
drucken ( "Jeff:" || verkohlen ( abgelaufen )) ;
Warten ( 0 ) ;
Anfang = PS-ZEIT () ;
Zum ( ich = 1 , ich <= imax , ich ++,
Zufallsliste = byron_randomizeList ( meine Liste ) ;
) ;
abgelaufen = PS-ZEIT () - Anfang ;
drucken ( „Byron:“ || verkohlen ( abgelaufen )) ;
Warten ( 0 ) ;
//AUSGANG
"pmroz: 121646"
"Jeff: 3990"
"Byron: 3488"
Betreff: Randomisieren Sie eine Listedie Ergebnisse ändern sich in JMP 13.
Schnelle Liste
400.000 sieht in JMP 13 so aus:
"pmroz: 0.533333333332848"
"Jeff: 0.233333333333576"
"Byron: 0,216666666667152"
Betreff: Randomisieren Sie eine ListeSehr interessant.Meine Tabellenlösung schien eine Art Brute Force zu sein, aber sie übertrifft die anderen beiden Funktionen, wenn die Anzahl der Listenelemente 15.000 überschreitet. Tabellenfunktionen sind anscheinend sehr effizient.

Hier ist der Code, den ich verwendet habe:
// pmroz-Version
pmroz_randomizeList = Funktion ({ eine Liste } , { Standardlokal } ,
Nr = Gegenstände ( eine Liste ) ;
dt = Neue Tabelle ( "" , unsichtbar , Zeilen hinzufügen ( Nr ) ,
Neue Spalte ( "Daten" , Numerisch , Kontinuierlich , Format ( "Am besten" , 12 ) ,
Werte einstellen ( eine Liste ) ) ,
Neue Spalte ( "Zufällig" , Numerisch , Kontinuierlich , Format ( "Am besten" , 12 ) ,
Formel ( Zufällige Uniform () ) )
) ;
dt << Sortieren ( Tisch ersetzen , durch ( : Zufällig )) ;
random_list = dt : Daten << Werte bekommen ;
nah dran ( dt , nicht sparen ) ;
random_list ;
) ;
// Jeff Perkinson 13. Juli 2016 14:00 (als Antwort auf Peter Mroz)
jeff_randomizeList = Funktion ({ eine Liste } , { Standardlokal } ,
eine Liste [ Rang ( j ( Gegenstände ( eine Liste ) , 1 , zufällige Uniform ()))]
) ;
// Byrons Funktion
byron_randomizeList = Funktion ({ eine Liste } , { Standardlokal } ,
Nr = Gegenstände ( eine Liste ) ;
rslist = zufälliges Mischen ( 1 :: Nr ) ;
Blase = eine Liste [ rslist [ 1 :: Nr ]] ;
) ;
nm = 4000 ; // Setze die Anzahl der Listenelemente
meine Liste = ( als Liste ( 1 :: nm ))[ 1 ] ;
Anfang = heute () ;
Zufallsliste = pmroz_randomizeList ( meine Liste ) ;
abgelaufen = heute () - Anfang ;
drucken ( "pmroz:" || verkohlen ( abgelaufen )) ;
Warten ( 0 ) ;
meine Liste = ( als Liste ( 1 :: nm ))[ 1 ] ;
Anfang = heute () ;
Zufallsliste = jeff_randomizeList ( meine Liste ) ;
abgelaufen = heute () - Anfang ;
drucken ( "Jeff:" || verkohlen ( abgelaufen )) ;
Warten ( 0 ) ;
meine Liste = ( als Liste ( 1 :: nm ))[ 1 ] ;
Anfang = heute () ;
Zufallsliste = byron_randomizeList ( meine Liste ) ;
abgelaufen = heute () - Anfang ;
drucken ( „Byron:“ || verkohlen ( abgelaufen )) ;
Warten ( 0 ) ;
Betreff: Randomisieren Sie eine ListeIn JMP gibt es fast immer mindestens drei Möglichkeiten, etwas zu tun.Hier also der dritte.
Erstellen Sie beginnend mit alist eine Liste mit gemischten Zahlen, die der Anzahl der Elemente in alist entspricht. Erstellen Sie dann blist mit den Werten von alist in der Reihenfolge von rslist.
alist={a,b,c, 1 , 2 , 3 };
rslist= zufälliges Mischen ( 1 :: Gegenstände (eine Liste));
blist=alist[rsliste[ 1 :: Gegenstände (eine Liste)]];
Dabei spielt es keine Rolle, ob Sie Zahlen oder Zeichen oder eine Kombination in der Liste verwenden.
Ich bin mir ziemlich sicher, dass ich diese Idee aus dem JSL-Begleitbuch habe
-Byron
Betreff: Randomisieren Sie eine ListeHier ist meine Implementierung.
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);Falls es nicht klar ist, was ich hier mache
- Das j() Funktion erstellt eine Matrix aus Zufallszahlen, zB [0.04757597646676, 0.738883488578722, 0.935981905087828, 0.0233044682536274, 0,493906983872876]
- Das Rang() Funktion gibt eine Matrix zurück (z. B. für oben: [4, 1, 5, 2, 3] ), die verwendet wird, um die ursprüngliche Liste in einer Reihenfolge zurückzugeben, in der die Zufallszahlen sortiert sind.
-Jeff
Betreff: Randomisieren Sie eine ListeHier ist eine Möglichkeit, dies zu tun.Würde mich über andere Ansätze freuen!
randomizeList = Funktion ({ Aufführen } , { Standardlokal } ,
Nr = Gegenstände ( Aufführen ) ;
dt = Neue Tabelle ( "" , unsichtbar , Zeilen hinzufügen ( Nr ) ,
Neue Spalte ( "Daten" , Numerisch , Kontinuierlich , Format ( "Am besten" , 12 ) ,
Werte einstellen ( Aufführen ) ) ,
Neue Spalte ( "Zufällig" , Numerisch , Kontinuierlich , Format ( "Am besten" , 12 ) ,
Formel ( Zufällige Uniform () ) )
) ;
dt << Sortieren ( Tisch ersetzen , durch ( : Zufällig )) ;
random_list = dt : Daten << Werte bekommen ;
nah dran ( dt , nicht sparen ) ;
random_list ;
) ;
aufführen = { 1 , 2 , 3 , 4 , 5 } ;
Zufallsliste = randomizeList ( aufführen ) ;
drucken ( Zufallsliste ) ; //Erwartete Ausgabe so etwas wie {2,4,5,1,3}