Post by nnnik » 14 Dec 2018, 13:47
Ich erhalte bei mir keine Nennenswerte Verzögerung bei der Verwendung von Sort,..Random.
Und 500ms bei der Array Variante bekomme.
Ich habe probleme das Nachzuvollziehen werde aber nicht weiter nachforschen.
Es scheint wohl so zu sein, dass Sort, Random in der Tat schneller ist als das manuelle Random und umsortieren.
Kommt jedoch das Aussortieren mit ins Spiel verliert Sort gegen die Array variante:
Code: Select all
SetBatchLines, -1
String := ""
Loop % (2**10)
String .= chr(A_Index)
string := BuchstabenMischen2(string) ;Zufällige Sortierung
Loop, 10
string .= string
t:= A_TickCount
ausgabe := BuchstabenMischen(string)
Msgbox % A_TickCount - t . " für " . StrLen(ausgabe) . " Zeichen ausgabe und " . StrLen(string) . " eingabe"
t:= A_TickCount
ausgabe := BuchstabenMischen2(string)
Msgbox % A_TickCount - t . " für " . StrLen(ausgabe) . " Zeichen ausgabe und " . StrLen(string) . " eingabe"
BuchstabenMischen(Eingabe) {
Local ; lokale Funktionsvariablen erzwingen
Ausgabe := "" ; Grundstellung Ausgabe (kann man auch weglassen)
For Jedes, Zeichen In StrSplit(Eingabe) ; Eingabe in Einzelzeichen splitten ...
Ausgabe .= Zeichen . "`n" ; ... und mit Trennzeichen `n nach Ausgabe übertragen
Ausgabe := RTrim(Ausgabe, "`n") ; letztes `n entfernen
Sort, Ausgabe, C U ; mehrfach vorkommende Zeichen aussortieren (ggf. ohne Option C)
Sort, Ausgabe, Random ; verbliebene Zeichen zufällig sortieren
Return StrReplace(Ausgabe, "`n") ; `n aus Ausgabe entfernen und den Rest zurückgeben
}
BuchstabenMischen2(string) {
stringArray := {} ;eingabe assoziativ array verwenden
for each, letter in strSplit(string)
{
stringArray[letter] := "" ;Einen Eintrag im Array unter Buchstabe machen
;(jeder Buchstabe kann nur einen Eintrag haben d.h. werden alle doppelten Aussortiert)
}
mixedStringArray := [] ;ausgabe array erstellen
for letter, _ in stringArray { ;für alle Einträge in dem Eingabe array
Random, newPosition, 1, %A_Index% ;würfle eine neue position
mixedStringArray.insertAt(newPosition, letter) ;füge den Buchstaben an diese Position ein (und verschiebe die anderen wenn notwendig)
}
outputString := "" ;den ausgabe string erzeugen
for each, letter in mixedStringArray { ;für jeden Buchstaben im ausgabe array
outputString .= letter ;diesen an den Ausgabe String anhängen
}
return outputString
}
Zudem verschluckt es auch noch das Trennzeichen.
Ich erhalte bei mir keine Nennenswerte Verzögerung bei der Verwendung von Sort,..Random.
Und 500ms bei der Array Variante bekomme.
Ich habe probleme das Nachzuvollziehen werde aber nicht weiter nachforschen.
Es scheint wohl so zu sein, dass Sort, Random in der Tat schneller ist als das manuelle Random und umsortieren.
Kommt jedoch das Aussortieren mit ins Spiel verliert Sort gegen die Array variante:
[code]SetBatchLines, -1
String := ""
Loop % (2**10)
String .= chr(A_Index)
string := BuchstabenMischen2(string) ;Zufällige Sortierung
Loop, 10
string .= string
t:= A_TickCount
ausgabe := BuchstabenMischen(string)
Msgbox % A_TickCount - t . " für " . StrLen(ausgabe) . " Zeichen ausgabe und " . StrLen(string) . " eingabe"
t:= A_TickCount
ausgabe := BuchstabenMischen2(string)
Msgbox % A_TickCount - t . " für " . StrLen(ausgabe) . " Zeichen ausgabe und " . StrLen(string) . " eingabe"
BuchstabenMischen(Eingabe) {
Local ; lokale Funktionsvariablen erzwingen
Ausgabe := "" ; Grundstellung Ausgabe (kann man auch weglassen)
For Jedes, Zeichen In StrSplit(Eingabe) ; Eingabe in Einzelzeichen splitten ...
Ausgabe .= Zeichen . "`n" ; ... und mit Trennzeichen `n nach Ausgabe übertragen
Ausgabe := RTrim(Ausgabe, "`n") ; letztes `n entfernen
Sort, Ausgabe, C U ; mehrfach vorkommende Zeichen aussortieren (ggf. ohne Option C)
Sort, Ausgabe, Random ; verbliebene Zeichen zufällig sortieren
Return StrReplace(Ausgabe, "`n") ; `n aus Ausgabe entfernen und den Rest zurückgeben
}
BuchstabenMischen2(string) {
stringArray := {} ;eingabe assoziativ array verwenden
for each, letter in strSplit(string)
{
stringArray[letter] := "" ;Einen Eintrag im Array unter Buchstabe machen
;(jeder Buchstabe kann nur einen Eintrag haben d.h. werden alle doppelten Aussortiert)
}
mixedStringArray := [] ;ausgabe array erstellen
for letter, _ in stringArray { ;für alle Einträge in dem Eingabe array
Random, newPosition, 1, %A_Index% ;würfle eine neue position
mixedStringArray.insertAt(newPosition, letter) ;füge den Buchstaben an diese Position ein (und verschiebe die anderen wenn notwendig)
}
outputString := "" ;den ausgabe string erzeugen
for each, letter in mixedStringArray { ;für jeden Buchstaben im ausgabe array
outputString .= letter ;diesen an den Ausgabe String anhängen
}
return outputString
}[/code]
Zudem verschluckt es auch noch das Trennzeichen.