hatschi1
Goto Top

Zufallsauswahl aus String

Hallo und frohe Ostern,

ich habe folgendes Problem:

Ich möchte gerne aus einem String fünf zufällige Buchstaben o. Zahlen. o. Sondernzeichen in
die Textbox1 einfügen. Dafür benutze ich den u.a. Code der auch super funktioniert. Wie kann ich verhindern, dass in Textbox1
per Zufall der gleiche Inhalt mehrfach eingetragen wird, bspw. "abc11" oder "22d1@"?
Es sollen keine Zahlen oder Buchstaben oder Sonderzeichen in Textbox1 doppelt vorkommen.

        Dim meinArray As String() = New String() {"a", "b", "c", "d", "1", "2", "#", "@", "~"}  
        Dim r As New Random
        TextBox1.Text = meinArray(r.Next(0, meinArray.Length)) & meinArray(r.Next(0, meinArray.Length)) & meinArray(r.Next(0, meinArray.Length)) & 
        meinArray(r.Next(0, meinArray.Length)) & meinArray(r.Next(0, meinArray.Length)) 

LG
Claudia

Content-ID: 665385

Url: https://administrator.de/contentid/665385

Ausgedruckt am: 26.11.2024 um 16:11 Uhr

maretz
maretz 04.04.2021 um 20:58:00 Uhr
Goto Top
Ich würde sowas (allerdings in Java) über nen Array machen bei dem ich eben immer wenn ich einen Wert genommen habe den aus dem Array lösche. ABER am Ende würde ich es vermutlich gar nicht machen weil ich damit ja sicherheitsmässig nur nen Schritt rückwärts machen würde.

Hast du 5 Zeichen und jedes kann nur EINMAL vorkommen ist die Möglichkeit das zu erraten ja bereits DEUTLICH höher (bzw. bei Brute-force auch deutlich schneller) als wenn du 5 Zeichen OHNE Einschränkung hast. Klar kann das Wort dann eben auch wirklich aaaaa lauten ABER man kann eben nie wissen ob sich Zeichen verdoppeln oder nicht.

Es kommt also drauf an was du vorhast - mir fällt erst mal aber kein Zweck ein wo es vorteilhaft ist solche Einschränkungen zu machen.
143611
143611 04.04.2021, aktualisiert am 05.04.2021 um 01:12:06 Uhr
Goto Top
Moin,

wie @maretz schon geschrieben hat, muss das bereits verwendete Zeichen aus dem Array verschwinden. Der Code (C#) könnte z.B. so aussehen:
/// <summary>
/// Returns a random string of a certain length using pre-defined valid characters without using one of them twice.
/// </summary>
/// <param name="stringLength">The desired length of the random string.</param> 
/// <param name="validCharacters">A list of available characters.</param> 
/// <returns>The random string</returns>
/// <exception cref="InvalidOperationException">Thrown if the desired string length exceeds the amout of available characters</exception> 
public string GetRandomString(uint stringLength, List<string> validCharacters) {
    if(stringLength > validCharacters.Count) {
        throw new InvalidOperationException("The string length exceeds the amount of available characters."); }  
    var retVal = new StringBuilder();
    var rnd = new Random();
    for (int i = 0; i <= stringLength; i++) {
        var randomValue = validCharacters[rnd.Next(0, validCharacters.Count - 1)];
        validCharacters.Remove(randomValue);
        retVal.Append(randomValue); }
    return retVal.ToString();
}
... 'n bisschen "over-the-top" für die Aufgabe, aber dafür generisch und das Prinzip wird trotzdem deutlich ;)
Ich hab' 'nen StringBuilder und eine List of char verwendet, um das Hin- und Her-Kopieren im Speicher zu minimieren.
Der Aufruf für Deinen konkreten Fall sähe dann so aus:
TextBox1.Text = GetRandomString(5, new List<char> { 'a', 'b', 'c', 'd', '1', '2', '#', '@', '~' });  
Ab Zeile 13 wird die Rückgabe generiert, indem die Schleife bis zur gewünschten Länge des strings durchlaufen wird.
Zeile 14 wählt das zufällige Zeichen aus und in Zeile 15 wird das verwendete Zeichen entfernt.

Viele Grüße
schleeke

P.S. Als Geheimnis/Passwort ist der Algorithmus denkbar ungeeignet (s. @maretz).
mayho33
mayho33 05.04.2021 aktualisiert um 12:42:07 Uhr
Goto Top
Wenn du die Ausgabe vorher in ein Array zwischenspeicherst kannst du das Ergebnis vorher prüfen und noch mal das RAND laufen lassen lassen für das doppelte Zeichen.

Wie die Kollegen oben schon schreiben ist es halt müßig im Speicher eine solche Berechnung zu machen. Kann leicht abgefangen werden.