Как генерировать случайную строку в Java [дубликат]

Этот вопрос уже имеет ответ здесь:

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

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

И я должен удостовериться, что нет никакого дублирующегося идентификатора.

70
задан tshepang 4 November 2013 в 18:11
поделиться

6 ответов

Создать случайную строку символов легко - просто используйте 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);
}

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

130
ответ дан 24 November 2019 в 13:15
поделиться

Думаю, вам поможет следующий код класса. Он поддерживает многопоточность, но вы можете сделать некоторые улучшения, например удалить блок синхронизации и синхронизировать с методом 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);
}

}
2
ответ дан 24 November 2019 в 13:15
поделиться

Вы также можете использовать класс 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

17
ответ дан 24 November 2019 в 13:15
поделиться

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

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

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

1
ответ дан 24 November 2019 в 13:15
поделиться

Это очень хорошо:

http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/RandomStringUtils.html - что-то вроде RandomStringUtils.randomNumeric (7) .

Существует 10 ^ 7 равновероятных (если java.util.Random не нарушено) различных значений, поэтому уникальность может быть проблемой.

53
ответ дан 24 November 2019 в 13:15
поделиться

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

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

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

1
ответ дан 24 November 2019 в 13:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: