Kann man in Python Buchstaben mischen und wieder zurückmischen?
Also, ich kenne ja folgendes:
from random import shuffle
string = "abcdefg"
liste = list(string)
shuffle(liste)
################Hier for Schleife, die die Liste wieder in einen String um wandelt######################
Aber gibt es eine Funktion, womit man das gezielt de-shuffeln kann?
7 Antworten
Mit random.shuffle nicht.
Aber du könntest z.B. etwas in der Art benutzen:
def my_shuffle(lst, seed = 123, revert = False):
if not type(lst) == list: raise TypeError('can only shuffle a list.')
def xorshift(seed):
x = 123456789
y = 362436069
z = 521288629
w = seed
while True:
t = x ^ (x << 11)
x = y
y = z
z = w
w ^= (w >> 19) ^ t ^ (t >> 8);
yield w
xor = xorshift(seed)
sbox = [next(xor) % len(lst) for i in range(len(lst))]
if revert: sequence = range(len(lst)-1,-1,-1)
else: sequence = range(len(lst))
for i in sequence:
tmp = lst[sbox[i]]
lst[sbox[i]] = lst[i]
lst[i] = tmp
#Der String, der "geshuffelt" wird
lst = list("lorem ipsum dolor sit amet")
#Einmal "shuffeln"
my_shuffle(lst, 123)
print(''.join(lst))
#und wieder "entshuffeln" (ACHTUNG: Funktioniert nur, wenn der selbe Seed wie beim "shuffeln" verwendet wird)
my_shuffle(lst, 123, True)
print(''.join(lst))
shuffle() ist eine auf Zufall aufgebaute Funktion und damit irreversible.
Stell dir das mischen eines Kartenspiels vor... du kannst anschließend die Karten zwar wieder sortieren, aber es ist fraglich, ob das Ergebnis dem Ausgangszustand entspricht?
Im besten Fall wäre sort() als komplementär-Methode zu shuffle() anzusehen.
Wenn du dir statt dem "Zurückmischen" einfach den ursprünglichen String merkst?
Ansonsten musst du dir das Misch-Muster merken und rückwärts anwenden. Wenn du aber ohnehin nur auf den Ausgangsstring zurück willst, ist die obige Methode viel einfacher.
Ich hätte da auch ein zusätzliches
liste_original = list(string)
gemacht. Ist halt nur nicht das gewünschte. Die Frage ist, ob das gewünschte notwendig ist.
Ja ist schon klar, aber da ein Computer nicht zufällig rechnen kann
Doch, ein Computer kann zufällig rechnen, das kommt auf die Vorgehensweise an. dev/random etwa erzeugt echte Zufallszahlen, bei denen kein Algorithmus genutzt wird, sondern das Umgebungsrauschen.
Und selbst wenn auf die Weise nur ein Startwert (seed) für einen Zufallsalgorithmus erzeugt wird, dann ist dieser Startwert echt zufällig. Diesen Wert müsstest du als Erstes herausfinden, um die Verschlüsselung zu knacken und den durchzuprobieren ist wahrscheinlich performancemäßig noch schlechter als ein Bruteforce-Angriff auf den String selbst.
Es IST ein Algorythmus! Der Physikalische Prozess wird eben DURCH den Algorythmus bearbeitet.
Und dieser Algorithmus kommt von Gott, oder wie? Und wie heißt der Algorithmus eigentlich, Algorithmen haben in der Regel einen Namen.
Denn aus irgendeiner Software kann der Algorithmus nicht kommen, da das Rauschen von physikalischen Bauteilen stammt. Ein simpler ohm'scher Widerstand zum Beispiel kann rauschen, wo soll da in der Schaltung dein Algorithmus hängen?
Ich hab übrigens Informatik studiert, ein bisschen was verstehe ich daher schon von dem Thema. Und bei dir so?
string = "".join(liste)
Das kommt anstelle dieser
Hier for Schleife, die die Liste wieder in einen String um wandelt
oder? Danke!
Tut mir leid. Aber tatsächlich basiert jede Zufallszahl eines Computers auf einen Algorythmus, der sich, wenn man sich die Parameter merkt, zurückverfolgen lässt und damit auch umkehren lässt.