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.
LG
Claudia
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 665385
Url: https://administrator.de/contentid/665385
Ausgedruckt am: 26.11.2024 um 16:11 Uhr
3 Kommentare
Neuester Kommentar
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.
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.
Moin,
wie @maretz schon geschrieben hat, muss das bereits verwendete Zeichen aus dem Array verschwinden. Der Code (C#) könnte z.B. so aussehen:
... '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:
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).
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();
}
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', '#', '@', '~' });
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).