Dictionary, doppelte Value in Zufall vermeiden

  • VB.NET

Es gibt 43 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Hallo
    am besten wende ich mich gleich an Erfinder Des Rades weil das der letzte Stand war.

    VB.NET-Quellcode

    1. 'ab hier dein Stiefel weitermachen...
    2. For k = 1 To Convert.ToInt32(ncZeichenlaenge.Value) ' gewählte Zeichenkettelänge
    3. Do
    4. For i = 1 To dic.Keys.Count ' zählt Anzahl der Keys
    5. z = r.Next(0, dic.Item(i).Length) ' zieht eine Zufallszahl
    6. Dim value() As String = dic.Item(i) ' gezogene Zeichen
    7. txtZeichenkette.Text += value(z) ' ausgabe zufalls Zeichenkette
    8. 'dic.Remove(i, dic.Item(i))
    9. lan += 1 ' Zeichenkettelänge um 1 erhöhen
    10. If lan = Convert.ToInt32(ncZeichenlaenge.Value) Then ' wenn Zeichenkettelänge ist gleich Zähler Zeichenkettelänge
    11. txtMehrereZeichenketten.Text += txtZeichenkette.Text & Environment.NewLine ' Zeichenkette in Textbox ausgeben
    12. Exit Sub
    13. End If
    14. Next i
    15. Loop
    16. Next k
    17. End Sub

    bei 'ab hier dein Stiefel weitermachen...
    ist dieses alles was ich mit meinem Wissen noch machen konnte.

    VB.NET-Quellcode

    1. For b = 1 To Convert.ToInt32(nc1.Value)
    2. For i = 0 To liste.Count - 1
    3. k = liste(i).Length
    4. z = r.Next(0, k)
    5. ak = liste(i)(z)
    6. txt1.Text += ak
    7. lan += 1
    8. If lan = Convert.ToInt32(nc1.Value) Then
    9. Exit Sub
    10. End If
    11. Next i
    12. Next b

    Hab unzählige möglichkeiten versucht ( mit Remove; mit RemoveAt; mit Substring),
    bekomme es leider nicht hin, das ich doppelte Zeichen vermeiden kann.
    Bitte immer noch um Hilfe, damit ich einen Zeichensatz ohne doppelte Zeichen hinbekomme.
    MfG. Willi
    Hallo
    hier der ganze Code

    VB.NET-Quellcode

    1. Dim r As New System.Random
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. txt1.Clear()
    4. Dim z As Integer ' Zufallbereich
    5. Dim i As Integer ' zähler für Listen einträge
    6. Dim k As Integer ' länge der Listeneinträge
    7. Dim b As Integer ' Schleife füt Länge des Zeichensatzes
    8. Dim liste As New List(Of String)
    9. Dim ak As String ' Gezogenes Zeichen ( A,a,5 usw.)
    10. Dim lan As Integer ' Länge des Zeichensatzes
    11. If chk1.Checked Then liste.Add("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
    12. If chk2.Checked Then liste.Add("abcdefghijklmnopqrstuvwxyz")
    13. If chk3.Checked Then liste.Add("1234567890")
    14. If chk4.Checked Then liste.Add("<,.-#+>;:-*!§$%&()=?ß")
    15. If liste.Count = 0 Then
    16. MessageBox.Show("Bitte ZeichenSätze auswählen")
    17. Exit Sub
    18. End If
    19. For b = 1 To Convert.ToInt32(nc1.Value) ' nc ist NumericUpDown und gibt die Länge des Zeichensatzes vor
    20. For i = 0 To liste.Count - 1
    21. k = liste(i).Length
    22. z = r.Next(0, k)
    23. ak = liste(i)(z)
    24. txt1.Text += ak
    25. lan += 1
    26. If lan = Convert.ToInt32(nc1.Value) Then
    27. Exit Sub
    28. End If
    29. Next i
    30. Next b
    31. End Sub

    MfG. Willi

    papawt schrieb:

    Hilfe, damit ich einen Zeichensatz ohne doppelte Zeichen hinbekomme.
    das ist doch garnet, was du willst.
    Die zeichensätze - du nennst sie sinnigerweise "liste", wohl um dich selbst zu verwirren - enthalten doch gar keine Doubletten.
    Was also willst du wirklich erhalten ohne doppelte Zeichen?

    (ich würde sehr empfehlen, die zeichensätze wieder zeichensaetze zu nennen statt liste - richtige Benamung hilft richtig denken)
    Hallo
    Es gibt eine

    VB.NET-Quellcode

    1. Dim liste As New List(Of String)
    .
    In diese Liste füge ich folgendes ein.

    VB.NET-Quellcode

    1. If chk1.Checked Then liste.Add("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
    2. If chk2.Checked Then liste.Add("abcdefghijklmnopqrstuvwxyz")
    3. If chk3.Checked Then liste.Add("1234567890")
    4. If chk4.Checked Then liste.Add("<,.-#+>;:-*!§$%&()=?ß")
    5. If liste.Count = 0 Then
    6. MessageBox.Show("Bitte ZeichenSätze auswählen")
    7. Exit Sub
    8. End If

    Dann zieh ich per Zufall einZeichen aus dieser Liste (a,A,5,# usw.)
    Diese gezogenen Zeichen gib ich in einer Textbox aus.
    Ich möchte das in der Tetbox keine doppelten Zeichen vorkommen (AA oder xx oder 55 oder...).
    Im Grunde genommen soll das ganze ein Passwort Generator ohne doppelte Zeichen, und mit mindestens einem Zeichen
    aus dem Zeichensatz den ich in die List of einfüge.
    MfG. Willi
    scheinbar hast du nicht verstanden, dass liste deine zeichensätze enthält.
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ist ein Zeichensatz
    "abcdefghijklmnopqrstuvwxyz" ist ein anderer Zeichensatz
    "1234567890" ist noch ein anderer Zeichensatz
    Und "<,.-#+>;:-*!§$%&()=?ß" ist noch ein anderer Zeichensatz
    Keiner dieser Zeichensätze enthält eine Doppelung.
    Alle diese Zeichensätze sind in liste drin - jedenfalls, wenn deine Form-User-Eingabe bestimmt hat, dass er zugefügt wird.
    Daher: Nenne liste so wie das was es ist: es sind deine Zeichensaetze.
    (nicht umsonst lautet meine Avatar-Unterschrift: "Nomen est Omen" - das ist Latein und heisst: "Der Name ist Programm" (so übersetzt es jdfs. Wikipedia).)



    egal (nein eiglich nicht egal, aber seisdrum) - du hast erkannt:

    papawt schrieb:

    Ich möchte das in der Tetbox keine doppelten Zeichen vorkommen
    Wie das zustandezubringen ist, wurde ja schon gesagt (tatsächlich bist du ja selbst drauf gekommen): Wenn du ein Zeichen aus einem Zeichensatz ziehst, dann entferne es anschliessend daraus - dann kann es nicht nochmal gezogen werden.
    (und hier wird wieder wichtig, dass dir klar ist, wo deine zeichensaetze sind, und aus welchem du grad ein Zeichen entnommen hast)
    Also wenn du aus zeichensaetze(i) das Zeichen ak gezogen hast, entferne es als nächstes aus zeichensaetze(i).
    Kann doch nicht so schwer sein. Die betreffenden Methoden, die einem String verfügbar sind wurden dir doch auch schon genannt.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Hallo

    VB.NET-Quellcode

    1. Dim r As New System.Random
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. txt1.Clear()
    4. Dim z As Integer ' Zufallszahl
    5. Dim i As Integer ' zähler für Zeichensätze einträge
    6. Dim k As Integer ' länge der Zeichensätze
    7. Dim b As Integer ' Schleife füt Anzahl wieviel in der Textbox ausgegeben wird
    8. Dim Zeichensaetze As New List(Of String)
    9. Dim ak As String ' Gezogenes Zeichen ( A,a,5 usw.)
    10. Dim lan As Integer ' Anzahl der Zeichen in der Textbox
    11. If chk1.Checked Then Zeichensaetze.Add("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
    12. If chk2.Checked Then Zeichensaetze.Add("abcdefghijklmnopqrstuvwxyz")
    13. If chk3.Checked Then Zeichensaetze.Add("1234567890")
    14. If chk4.Checked Then Zeichensaetze.Add("<,.-#+>;:-*!§$%&()=?ß")
    15. If Zeichensaetze.Count = 0 Then
    16. MessageBox.Show("Bitte ZeichenSätze auswählen")
    17. Exit Sub
    18. End If
    19. For b = 1 To Convert.ToInt32(nc1.Value) ' nc ist NumericUpDown und gibt die Länge des Zeichensatzes vor
    20. For i = 0 To Zeichensaetze.Count - 1
    21. k = Zeichensaetze(i).Length
    22. z = r.Next(0, k)
    23. ak = Zeichensaetze(i)(z)
    24. Zeichensaetze.Remove(ak)
    25. txt1.Text += ak
    26. lan += 1
    27. If lan = Convert.ToInt32(nc1.Value) Then
    28. Exit Sub
    29. End If
    30. Next i
    31. Next b
    32. End Sub

    Ist Remove

    VB.NET-Quellcode

    1. Zeichensaetze.Remove(ak)
    Richtig?
    Glaub ich nicht weil immer noch doppelte in der Textbox vorkommen.
    Spätestens wenn Du einen Haltepunkt in die Methode bei Zeile#24 setzt, sollte klar werden, dass Zeichensätze eine Stringliste mit bis zu 4 Einträgen ist.

    Quellcode

    1. ABCDEFGHIJKLMNOPQRSTUVWXYZ
    2. abcdefghijklmnopqrstuvwxyz
    3. 1234567890
    4. <,.-#+>;:-*!§$%&()=?ß
    Wenn Du nun sagst: "Entferne mir aus dieser Liste das A", dann passiert - nix. Weil es keinen Eintrag gibt, der A ist.
    Sondern es gibt nur die 4 oben genannten. Es gibt zwar einen, der das A enthält. Aber Dein Code arbeitet danach nicht. Es können also nur die genannten Einträge entfernt werden. Du kannst also sagen: entferne mir den Eintrag 1234567890. Dann ist einer von 4 weg. Aber wenn Du nur sagst: Entferne mir A, dann sagt Dir der Compiler: Nö, hab ich nicht, kenn ich nicht. Ich kenn nur die 4 oben genannten.
    Daher musst Du den Code so abändern, dass aus dem passenden Listeneintrag das entsprechende Zeichen entfernt wird.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Nochemol: die Zeile Zeichensaetze.Remove entfernt einen Eintrag aus der Liste Zeichensaetze. Das willst Du nicht. Du hast nur 4 Einträge in dieser Liste und die brauchst Du noch alle. Daher darfst Du Zeichensaetze.Remove gar nicht verwenden. Wenn, dann musst Du die 4 Zeichensaetze-Einträge durchgehen und dann den passenden Eintrag (also den, in dem das zufallsgewählte Zeichen drin ist) bearbeiten. Aber Zeichensaetze.Remove hat in Deinem Code nix verloren.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo,
    String-Manipulation sind "teure" Aktionen die Leistung kosten und sollte man auf ein Minimum beschränken. Meine Empfehlung an dich ist, zuerst deine List(Of String) mit deinen Zeichensätzen in ein Char-Array zu verketten und dieses verwenden. Das entfernen von Einträgen aus diesem Array solltest du dir sparen und stattdessen das Zeichen z.B. durch ein Zero-Byte ersetzen. Mit neueren .NET-Versionen werden Möglichkeiten bereitgestellt, Strings effektiver zu erzeugen und zu manipulieren, indem man z.B. mit der String.Create Funktion und Spans arbeitet - Ich habe mal ein vereinfachtes Beispiel erstellt, was letztlich dein Problem löst. (Achtung, das ist aus C# Konvertierter VB.NET Code)

    VB.NET-Quellcode

    1. Dim l As List(Of String) = New List(Of String) From {
    2. "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz", "1234567890", "<,.-#+>;:-*!§$%&()=?ß"
    3. } ' Liste, die der Benutzer zusammenklickt
    4. Dim availableCharacters = String.Concat(l).ToCharArray()
    5. Dim charactersToSelect As Integer = 10 ' Anzahl der zu ermittelnden Zeichen
    6. Dim random As Random = New Random()
    7. Dim s = String.Create(charactersToSelect, availableCharacters, Sub(span, value)
    8. Dim currentCharacters = value.AsSpan()
    9. Dim nullChar = Convert.ToChar(0)
    10. For i As Integer = 0 To span.Length - 1
    11. Dim added As Boolean = False
    12. While Not added
    13. Dim rv = random.Next(value.Length)
    14. If currentCharacters(rv) <> nullChar Then
    15. span(i) = currentCharacters(rv) ' Neuen Wert in Zielstring einfügen
    16. currentCharacters(rv) = nullChar ' Ein zufällig gewähltes Zeichen nur einmal verwenden und mit 0 überschreiben
    17. added = True
    18. End If
    19. End While
    20. Next
    21. End Sub)


    Vielleicht inspiriert dich folgender Code; Aber bitte nicht einfach blind übernehmen, ohne zu verstehen, was da passiert.

    papawt schrieb:

    Hallo

    VB.NET-Quellcode

    1. Zeichensaetze.Remove(ak.Substring(0, z))

    nähere ich mich schon der Lösung oder wie Weit bin ich noch entfernt?
    Das ist nur blindes Rumprobieren, ohne hingucken oder zuhören.
    Ich schrieb:

    ErfinderDesRades schrieb:

    Also wenn du aus zeichensaetze(i) das Zeichen ak gezogen hast, entferne es als nächstes aus zeichensaetze(i).
    Da steht:
    Entferne ak aus zeichensaetze(i). Weil aus zeichensaetze(i) hast du es gezogen.
    Da steht nicht: Entferne ak aus zeichensaetze. Weil wie gesagt, in zeichensaetze isses ja nicht drin. Da haste es ja auch nicht rausgezogen.

    Verstehe den Unterschied zwischen zeichensaetze und zeichensaetze(i).
    Das eine ist eine Liste, das andere ein Element davon, nämlich ein zeichensatz. Deswegen heisst die Liste zeichensaetze. Sie heisst ja nicht: aks, und das aus gutem Grund (weil es sind zeichensätze drin, keine aks (was immer das sein mag)).
    Und ak ist ein zeichen aus diesem zeichensatz.
    Dann entferne es aus dem zeichensatz, nicht aus der Liste. In der Liste isses nicht drin, ok?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    VB.NET-Quellcode

    1. Public Sub btnGenerator_Click(sender As Object, e As EventArgs) Handles btnGenerator.Click
    2. txtZeichenkette.Clear()
    3. Dim r As New System.Random ' Zufallsgenerator
    4. Dim zeichenSaetze As New List(Of String)
    5. If chkGrossBuchstaben.Checked Then zeichenSaetze.Add("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
    6. If chkKleinBuchstaben.Checked Then zeichenSaetze.Add("abcdefghijklmnopqrstuvwxyz")
    7. If chkZahlen.Checked Then zeichenSaetze.Add("1234567890")
    8. If chkSonderzeichen.Checked Then zeichenSaetze.Add("<,.-#+>;:-*!§$%&()=?ß")
    9. If zeichenSaetze.Count = 0 Then
    10. MessageBox.Show("Bitte Zeichensätze auswählen")
    11. Exit Sub
    12. End If
    13. 'ab hier dein Stiefel weitermachen - na, mach ichs halt selber
    14. Do
    15. For i = 0 To zeichenSaetze.Count - 1
    16. Dim zeichenSatz = zeichenSaetze(i)
    17. Dim z = r.Next(0, zeichenSatz.Length) ' zieht eine Zufallszahl
    18. txtZeichenkette.Text += zeichenSatz(z) ' ausgabe zufallsZeichen
    19. zeichenSaetze(i) = zeichenSatz.Remove(z, 1) ' zufallsZeichen aus zeichenSaetze(i) entfernen
    20. If txtZeichenkette.Text.Length = Convert.ToInt32(ncZeichenlaenge.Value) Then ' wenn gewünschte Länge erreicht
    21. txtMehrereZeichenketten.Text += txtZeichenkette.Text & Environment.NewLine ' Zeichenkette in Textbox ausgeben
    22. Exit Sub
    23. End If
    24. Next i
    25. Loop
    26. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Anstelle etwas von den zeichensaetzen zu entfernen ist es einfacher zu testen ob character schon in der txtZeichenkette enthalten ist. Wenn nicht dann zu addieren anderseits weitermachen ohne zu addiere.

    Visual Basic-Quellcode

    1. Public Sub btnGenerator_Click(sender As Object, e As EventArgs) Handles btnGenerator.Click
    2. txtZeichenkette.Clear()
    3. Dim z As Integer ' Zufallszahl
    4. Dim i As Integer ' Zähler für anzahl Keys
    5. Dim k As Integer ' Zähler für Zeichenkettelänge
    6. Dim lan As Integer 'Zeichenkettelänge
    7. Dim r As New System.Random ' Zufallsbereich (von bis)
    8. Dim dic As New Dictionary(Of Integer, String())
    9. Dim ak As Integer
    10. ak = 0 'Key
    11. If chkGrossBuchstaben.Checked = True Or chkKleinBuchstaben.Checked = True Or chkSonderzeichen.Checked = True Or chkZahlen.Checked = True Then ' wenn Checkbox.Checked = True
    12. If chkGrossBuchstaben.Checked Then
    13. ak += 1 'erhöht Key um 1
    14. dic.Add(ak, New String() {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O",
    15. "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"})
    16. End If
    17. If chkKleinBuchstaben.Checked Then
    18. ak += 1 'erhöht Key um 1
    19. dic.Add(ak, New String() {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o",
    20. "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"})
    21. End If
    22. If chkZahlen.Checked Then
    23. ak += 1 'erhöht Key um 1
    24. dic.Add(ak, New String() {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"})
    25. End If
    26. If chkSonderzeichen.Checked Then
    27. ak += 1 'erhöht Key um 1
    28. dic.Add(ak, New String() {"<", ",", ".", "-", "#", "+", ">", ";", ":", "-", "*", "!", "§", "$", "%",
    29. "&", "(", ")", "=", "?", "ß"})
    30. End If
    31. Else
    32. If chkGrossBuchstaben.Checked = False And chkKleinBuchstaben.Checked = False And chkSonderzeichen.Checked = False And chkZahlen.Checked = False Then
    33. MessageBox.Show("Bitte Zeichen auswählen")
    34. Exit Sub
    35. End If
    36. End If
    37. For k = 1 To Convert.ToInt32(ncZeichenlaenge.Value) ' gewählte Zeichenkettelänge
    38. Do
    39. For i = 1 To dic.Keys.Count ' zählt Anzahl der Keys
    40. z = r.Next(0, dic.Item(i).Length) ' zieht eine Zufallszahl
    41. Dim value() As String = dic.Item(i) ' gezogene Zeichen
    42. If Not txtZeichenkette.Text.Contains(value(z)) Then
    43. txtZeichenkette.Text += value(z) ' ausgabe zufalls Zeichenkette
    44. End If
    45. 'dic.Remove(i, dic.Item(i))
    46. lan += 1 ' Zeichenkettelänge um 1 erhöhen
    47. If lan = Convert.ToInt32(ncZeichenlaenge.Value) Then ' wenn Zeichenkettelänge ist gleich Zähler Zeichenkettelänge
    48. txtMehrereZeichenketten.Text += txtZeichenkette.Text & Environment.NewLine ' Zeichenkette in Textbox ausgeben
    49. Exit Sub
    50. End If
    51. Next i
    52. Loop
    53. Next k
    54. End Sub​

    Hi,

    ich stelle mal eine andere Idee in den Raum, das HashSet.
    Vielleicht ist es eine Überlegung wert?

    Vor einiger Zeit habe ich mal einen Lottozahlengenerator entwickelt, der auch gleich meine Zahlen mit den selbst gezogenen Zahlen vergleicht.
    Seit ich dann die Treffer bei ein paar Millionen Ziehungen gesehen habe, habe ich aufgehört zu spielen ;o)

    Aber, das Konstrukt lässt sich natürlich auch für Passworte ändern!
    Hier ein Minibeispiel für die Konsole:

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. namespace Passworte {
    4. class Program {
    5. static void Main() {
    6. Random rnd = new Random();
    7. HashSet<int> numbers = new HashSet<int>();
    8. for (int i = 0; i < 30; i++) {
    9. numbers.Clear();
    10. while (numbers.Count < 30) numbers.Add(rnd.Next(33, 126));
    11. foreach (int item in numbers) {
    12. Console.Write("{0}", (char)item);
    13. }
    14. Console.WriteLine();
    15. }
    16. Console.ReadKey();
    17. }
    18. }
    19. }


    Das Teil generiert 30 Passworte mit 30 Stellen aus dem ASCII Bereich, bei denen sich die Zeichen pro Passwort nicht wiederholen.
    Vielleicht habe ich aber auch den Sinn Deines Anliegens nicht richtig verstanden, kann ja sein.
    Lässt sich natürlich leicht an deine Vorgaben anpsssen und alle möglichen Listen sind dann verwendbar.
    Das überlasse ich aber Dir. Ich will nur eine weitere Möglichkeit aufzeigen.

    Oder so, dann kannst Du mit vordefinierten Zeichen arbeiten:

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. namespace Passworte {
    4. class Program {
    5. static void Main() {
    6. char[] permitted = ("ABCDEFGHIJKLMOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!§$%&()=?.:,;#+*").ToCharArray();
    7. Random rnd = new Random();
    8. for (int i = 0; i < 30; i++) {
    9. HashSet<char> pwArray = new HashSet<char>();
    10. while (pwArray.Count < 30) pwArray.Add(permitted[rnd.Next(0, permitted.Length - 1)]);
    11. foreach (char item in pwArray) Console.Write("{0}", item);
    12. Console.WriteLine();
    13. }
    14. Console.ReadKey();
    15. }
    16. }
    17. }


    So etwas kommt dann raus:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „simpelSoft“ ()

    minimalist schrieb:

    Anstelle etwas von den zeichensaetzen zu entfernen ist es einfacher zu testen ob character schon in der txtZeichenkette enthalten ist. Wenn nicht dann zu addieren anderseits weitermachen ohne zu addiere.
    Das ist eben nicht richtig. Je länger das Passwort wird, desto wahrscheinlicher muss per Zufall mittels Wiederholung ein neues Zeichen ermittelt werden. Beim Kürzen der verfügbaren Zeichen kann das nie passieren. Und: man kann bei der Kürzungsmethode sehr einfach feststellen, ob überhaupt noch Zeichen in dem Zeichensatz drin sind, die man verwenden kann: Wenn nix mehr bei den zur Verfügung stehenden Zeichen drin ist, sind alle im Passwort drin. Da bekommst Du mit Deiner Methode Schwierigkeiten, das so einfach zu testen.
    Klar, bei kurzen Passwörtern gibt es keine Probleme. Aber das macht die Sache vom Prinzip her nicht richtig.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Klar kann man einen PasswordGenerator auf viele Weisen umsetzen.
    Zum Beispiel könnte man infragestellen, warum überhaupt Doubletten ausschliessen.
    Passworte sind viel viel viel stärker, wenn Doubletten erlaubt sind.

    Und Sicher kann man Wiederholungen auch ausschliessen, indem man immer wieder drauf testet - mit Hashset oder sonstwie.
    Find ich nicht so elegant wie wenn man benutzte Zeichen einfach entfernt (diesen Ansatz setzt der in post#4 angesprochene Fisher-Yate-Algo übrigens auf seine Weise unübertrefflich elegant um).

    Jdfs. die in post#35 gezeigte Lösung arbeitet mit Entfernen benutzter zeichen, und ist die praktikable Umsetzung der in post#1 erkennbaren Grundidee: Entfernen benutzter Zeichen.
    Diese Grundidee hab zumindest ich im Verlauf des Threads immer verfolgt.
    Leider ist vom TE, nachdem ich fund dass eiglich die wesentlichsten Hinweise gegeben waren, nix mehr gekommen, da habichs eben selbst so umgesetzt wie besprochen, um dem einen Abschluss zu geben.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Guten Morgen
    bin wieder da.
    hat sich einiges getan vom letzten mal.
    Als erstes möchte ich mich bei allen Hillfe anbietenden Bedanken,aber vor allen
    Danke an ErfinderDesRades für deine Geduld die du geopfert hast mit so einem Schwierigen Fall wie mich.
    Werde natürlich alle Codes mir ansehen,werde aber höchst Warscheinlich den von ErfinderDesRades nehmen,
    weil der so ist wie ich es gewünscht habe, und den ich so beim ersten Überblick verstanden hab.
    Möchte nun das Thema beenden.
    Noch einmal Danke für alles.
    MfG. Willi