Problem bei For Schleife (Random String Generator)

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von seh.

    Ich meine den Fall charCount = 0. Wenn charCount = 0, einfach String.Empty zurückgeben. Der Sinn hiervon ist übrigens, dass der StringBuilder nicht umsonst erzeugt wird, was sich ja einfach vermeiden lässt. Warum man den Fall 0 berücksichtigt: Wenn man es hier macht, führt es nicht zu unerwartetem Verhalten von außen. Wenn du bspw. eine TrackBar für die Buchstabenzahl hast, die du von 0 bis 100 fährst, dann erhältst du bei 0 einen Fehler, aber Strings der Länge 0 sind ebenfalls gültig - es ist halt dann eine zufällige Zeichenkette der Länge 0.

    Ich denke außerdem, dass das mit der Guid nicht beliebig funktioniert. Wäre auch nicht meine Empfehlung, außer es kommt auf die Eindeutigkeit an.

    Viele Grüße
    ~blaze~

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

    Das bedeutet nur, dass ich es nicht getestet habe, aber die Vermutung sich aus der Betrachtung des Codes ergeben hat - was aber nicht zu 100% korrekte Resultate liefert. Jeder, der den Code anschaut und zum gleichen Schluss kommt, weiß, was ich meine. 32 Zeichen maximal würden halt wiederum nicht ins Konzept passen. Und da die Beschreibung fehlt und der Code nicht schnell intuitiv verständlich ist, kann es ja auch sein, dass du irgendwas hingebogen hast, sodass es funktioniert.

    Eindeutigkeit würde außerdem in der jetzigen Implementation nicht garantiert, fällt mir gerade auf. Wenn du Eindeutigkeit haben wolltest, müsstest du das Alphabet auf 26 Zeichen abbilden und dann ergeben sich weitere Probleme, weil es dann keine gleichmäßige Verteilung mehr gibt. Ich denke, die einfachere Lösung ist wirklich einfach, das so zu belassen, wie es jetzt ist.
    Die einzige Lösung, die mir jetzt einfiele, die ggf. möglich wäre, wäre, die Guid als Byte-Array aufzufassen und durch Random (charCount - 16) Bytes generierte anzuhängen. Danach würde ich immer in 5-Bit-Schritten hochzählen und, wenn der Wert > 26 ist, das 5. Bit auf 0 setzen und im nächsten Schritt als 1 verwenden und nur noch 4 Bits lesen. Dadurch erhält man halt auch keine wirklich tolle Lösung, schätze ich...
    Hashwert bilden ginge auch, wäre aber ineffizient, da man halt ggf. sehr viele bilden muss.

    Das Problem bei generischen Algorithmen ist, dass man nicht weiß, was sie später lösen sollen. Random, usw. sind verhältnismäßig kompliziert implementiert, aber das aus gutem Grund, man will ja, dass die Lösungen für beliebige Probleme funktionieren.

    Viele Grüße
    ~blaze~

    ~blaze~ schrieb:

    Und da die Beschreibung fehlt und der Code nicht schnell intuitiv verständlich ist, kann es ja auch sein, dass du irgendwas hingebogen hast, sodass es funktioniert.

    Oh das ist böse, gar nicht nett.

    Gut, dann bauen wir mal auf dem letzten Code von "seh" auf - diesen hier: LINK
    Auch daraus machen wir mal flux einen Einzeiler (wenn man mal die Fehlerbehandlung von "seh" außen vor lässt), ohne den Stringbuilder und die olle Schleife - ist doch viel Pragmatischer - nur Zeile 6 tut den Job!

    C#-Quellcode

    1. private string NextString(Random rnd, int charCount, string characterSet = "abcdefghijklmnopqrstuvwxyz")
    2. {
    3. if (charCount <= 0)
    4. throw new ArgumentException("charCount needs to be greater than zero.");
    5. return new string(Enumerable.Repeat(characterSet, charCount).Select(s => s[rnd.Next(s.Length)]).ToArray());
    6. }


    Aber vielleicht habe ich ja wieder nur etwas hingebogen, was irgendwie funktioniert? Wer weiß? :whistling: :thumbsup: