So generieren Sie einen zufälligen String in Java [duplicate]

Lesezeit: 1 Minute

Benutzer-Avatar
Chandra Wibowo

Ich habe ein Objekt namens Studentund es hat studentName, studentId, studentAddressusw. Für die studentIdmuss ich eine zufällige Zeichenfolge generieren, die aus sieben numerischen Zeichen besteht, z.

studentId = getRandomId();
studentId = "1234567" <-- from the random generator.

Und ich muss sicherstellen, dass es keine doppelte ID gibt.

  • Wenn ich Ihre Frage richtig gelesen habe, möchten Sie eine Zufallszahl R generieren, sodass 1.000.000 <= R <= 9.999.999, und diese dann in eine Zeichenfolge umwandeln?

    – MSalter

    19. Mai 2010 um 9:29 Uhr

  • Wäre es einfacher, zuerst eine Zufallszahl zu generieren und sie dann in eine Zeichenfolge umzuwandeln?

    – Chandra Wibowo

    19. Mai 2010 um 11:43 Uhr

  • Na, wie lief die Hausaufgabe?

    – james.garriss

    13. Mai 2015 um 18:52 Uhr

  • Diese 3 einzeiligen Codes sind sehr nützlich, denke ich. Long.toHexString(Double.doubleToLongBits(Math.random())); UUID.randomUUID().toString(); RandomStringUtils.randomAlphanumeric(16);

    – Mandar

    8. Juni 2016 um 7:33 Uhr

  • Wie können Sie angesichts der begrenzten Datendimension die Eindeutigkeit sicherstellen? Wenn die Anzahl der Schüler 10^7 überschreitet, haben Sie keine Möglichkeit, jedem eine eindeutige Nummer zuzuweisen.

    – Alex Salauyou

    27. Juli 2016 um 9:01 Uhr

Das Generieren einer zufälligen Zeichenfolge ist einfach – verwenden Sie einfach java.util.Random und eine Zeichenfolge, die alle Zeichen enthält, die verfügbar sein sollen, z

public static String generateString(Random rng, String characters, int length)
{
    char[] text = new char[length];
    for (int i = 0; i < length; i++)
    {
        text[i] = characters.charAt(rng.nextInt(characters.length()));
    }
    return new String(text);
}

Aus Gründen der Eindeutigkeit müssen Sie die generierten Zeichenfolgen jetzt irgendwo speichern. Wie Sie das tun, hängt wirklich vom Rest Ihrer Anwendung ab.

  • @chandra: Ja, genau. Geben Sie ihm eine Zeichenfolge der Zeichen, aus denen Sie auswählen möchten. Wenn Sie also nur Ziffern wollen, geben Sie “0123456789” ein. Wenn Sie nur Großbuchstaben wollten, würden Sie “ABCDEFGHIJKLMNOPQRSTUVWXYZ” usw.

    – Jon Skeet

    20. Mai 2010 um 6:08 Uhr

  • Ist das richtiger als die Verwendung von UUID.randomUUID().toString()? Wenn ja warum?

    – Isaak

    5. September 2013 um 1:33 Uhr


  • @Is7aq: Nun, es bietet erheblich mehr Kontrolle über die Ausgabe, sowohl in Bezug auf die verwendeten Zeichen als auch auf die Länge der Zeichenfolge.

    – Jon Skeet

    5. September 2013 um 5:52 Uhr

  • Warum hast du Random als Parameter übergeben?

    – RockOnGom

    8. Dezember 2014 um 20:43 Uhr

  • @RockOnGom: Tut mir leid, ich hatte diesen Kommentar schon einmal übersehen. Für solche Sachen schaue ich mir das an Random als effektiv eine Abhängigkeit – wenn Sie es hier akzeptieren, kann der Aufrufer entscheiden, ob er ein Preseed verwenden möchte Random um wiederholbare Ergebnisse zu erhalten (z. B. für Tests), a SecureRandom um es für Sicherheitszwecke geeignet zu machen usw.

    – Jon Skeet

    30. November 2015 um 6:36 Uhr

Benutzer-Avatar
David Soroko

Das ist sehr nett:

http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/RandomStringUtils.html – etwas wie RandomStringUtils.randomNumeric(7).

Es gibt 10^7 gleichwahrscheinlich (ggf java.util.Random nicht beschädigt ist) unterschiedliche Werte, sodass die Eindeutigkeit ein Problem sein kann.

Benutzer-Avatar
Teil

Sie können auch die UUID-Klasse aus dem java.util-Paket verwenden, die eine zufällige UUID von 32-Bit-Zeichenzeichenfolgen zurückgibt.

java.util.UUID.randomUUID().toString()

http://java.sun.com/j2se/1.5.0/docs/api/java/util/UUID.html

  • Das ist jedoch nicht dasselbe wie “eine zufällige Zeichenfolge aus 7 numerischen Zeichen”.

    – Jon Skeet

    5. September 2013 um 5:53 Uhr

  • Zufällige UUIDs sind jedoch grundsätzlich eindeutig. Wenn Sie daraus eine numerische Zeichenfolge benötigen, hashen Sie sie.

    – Pedroro

    20. Januar 2016 um 20:18 Uhr

Benutzer-Avatar
karthik.j

Random ran = new Random();
int top = 3;
char data=" ";
String dat = "";

for (int i=0; i<=top; i++) {
  data = (char)(ran.nextInt(25)+97);
  dat = data + dat;
}

System.out.println(dat);

Benutzer-Avatar
Erol Özcan

Ich denke, der folgende Klassencode wird Ihnen helfen. Es unterstützt Multithreading, aber Sie können einige Verbesserungen vornehmen, z. B. den Synchronisierungsblock entfernen und mit der Methode getRandomId() synchronisieren.

public class RandomNumberGenerator {

private static final Set<String> generatedNumbers = new HashSet<String>();

public RandomNumberGenerator() {
}

public static void main(String[] args) {
    final int maxLength = 7;
    final int maxTry = 10;

    for (int i = 0; i < 10; i++) {
        System.out.println(i + ". studentId=" + RandomNumberGenerator.getRandomId(maxLength, maxTry));
    }
}

public static String getRandomId(final int maxLength, final int maxTry) {
    final Random random = new Random(System.nanoTime());
    final int max = (int) Math.pow(10, maxLength);
    final int maxMin = (int) Math.pow(10, maxLength-1);
    int i = 0;
    boolean unique = false;
    int randomId = -1;
    while (i < maxTry) {
        randomId = random.nextInt(max - maxMin - 1) + maxMin;

        synchronized (generatedNumbers) {
            if (generatedNumbers.contains(randomId) == false) {
                unique = true;
                break;
            }
        }
        i++;
    }
    if (unique == false) {
        throw new RuntimeException("Cannot generate unique id!");
    }

    synchronized (generatedNumbers) {
        generatedNumbers.add(String.valueOf(randomId));
    }

    return String.valueOf(randomId);
}

}

Benutzer-Avatar
Chris Henry

Die erste Frage, die Sie sich stellen müssen, ist, ob die ID wirklich zufällig sein muss. Manchmal sind fortlaufende IDs gut genug.

Wenn Sie es nun wirklich brauchen, um zufällig zu sein, beachten Sie zunächst, dass eine generierte Zahlenfolge, die keine Duplikate enthält, nicht als zufällig bezeichnet werden kann. :p Jetzt, wo wir das aus dem Weg geräumt haben, ist der schnellste Weg, dies zu tun, a Hashtable oder HashMap enthält alle bereits generierten IDs. Immer wenn eine neue ID generiert wird, prüfen Sie sie gegen die Hashtabelle, generieren Sie sie erneut, wenn die ID bereits vorhanden ist. Dies funktioniert im Allgemeinen gut, wenn die Anzahl der Schüler viel kleiner ist als der Bereich der IDs. Wenn nicht, stecken Sie in größeren Schwierigkeiten, da die Wahrscheinlichkeit steigt, dass eine ID neu generiert werden muss, P(generate new ID) = number_of_id_already_generated / number_of_all_possible_ids. Überprüfen Sie in diesem Fall den ersten Absatz (muss die ID zufällig sein?).

Hoffe das hilft.

Benutzer-Avatar
Sebastian Lorber

Viele Möglichkeiten…

Sie wissen, wie man zufällig eine ganze Zahl generiert, oder? Sie können also daraus ein Zeichen generieren … (ex 65 -> A)

Es hängt davon ab, was Sie brauchen, das Maß an Zufälligkeit, die damit verbundene Sicherheit … aber für ein Schulprojekt würde es meiner Meinung nach passen, eine UUID-Teilzeichenfolge zu erhalten 🙂

  • Ja, es ist nur für ein Schulprojekt, also muss ich mir keine Sorgen um Sicherheit und so machen, aber UUID produziert einen 32-Zeichen-String, alles, was ich brauche, ist 7. Ich habe gerade eine Idee, ist es möglich, nur das 7. erste Zeichen von 32 zu nehmen ?

    – Chandra Wibowo

    19. Mai 2010 um 12:28 Uhr

  • Substring verwenden … was ich gesagt habe 🙂

    – Sebastian Lorber

    19. Mai 2010 um 13:23 Uhr

1175610cookie-checkSo generieren Sie einen zufälligen String in Java [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy