Как создать случайную строку в Java

У меня есть объект с именем Student, и он имеет studentName, studentId, studentAddress и т.д. Для studentId я должен создать случайную строку, состоящую из семи числовых символов, например.

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

И я должен убедиться, что нет дубликата id.

Ответ 1

Генерация случайной строки символов проста - просто используйте java.util.Random и строку, содержащую все символы, которые вы хотите использовать, например

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);
}

Теперь, для уникальности вам нужно будет хранить сгенерированные строки где-нибудь. Как вы это сделаете, это будет зависеть от остальной части вашего приложения.

Ответ 3

Вы также можете использовать класс UUID из пакета java.util, который возвращает случайный uuid из 32-битных символов String.

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

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

Ответ 4

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);

Ответ 5

Я думаю, что следующий код класса поможет вам. Он поддерживает многопоточность, но вы можете сделать некоторые улучшения, такие как удаление блока синхронизации и синхронизация с методом getRandomId().

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);
}

}

Ответ 6

Первый вопрос, который вам нужно задать, заключается в том, действительно ли вам нужен идентификатор, чтобы быть случайным. Иногда последовательные идентификаторы достаточно хороши.

Теперь, если вам нужно, чтобы это было случайным, мы сначала заметим, что сгенерированная последовательность чисел, которые не содержат дубликатов, не может быть вызвана случайным образом.: p Теперь, когда мы это устраняем, самый быстрый способ сделать это - иметь Hashtable или HashMap, содержащий все уже созданные идентификаторы. Всякий раз, когда генерируется новый идентификатор, проверьте его на хэш-таблицу, заново создайте, если идентификатор уже существует. Это, как правило, хорошо работает, если количество студентов намного меньше, чем количество идентификаторов. Если нет, вы испытываете более глубокие проблемы, так как вероятность необходимости восстановления идентификатора возрастает, P (сгенерировать новый идентификатор) = number_of_id_already_generated/number_of_all_possible_ids. В этом случае проверьте первый абзац (вам нужно, чтобы ID был случайным?).

Надеюсь, что это поможет.

Ответ 7

Много возможностей...

Вы знаете, как правильно генерировать целое число? Таким образом, вы можете создать char из него... (ex 65 → A)

Это зависит от того, что вам нужно, уровня случайности, связанной с безопасностью... но для школьного проекта я предполагаю, что получение подстроки UUID будет соответствовать:)