Java: случайным образом генерировать разные имена - PullRequest
10 голосов
/ 17 февраля 2011

Мне нужно сгенерировать 10000 уникальных идентификаторов в Java. Идентификаторы должны состоять из цифр и букв и содержать не более 10 символов каждый. Есть идеи? Встроенные библиотеки будут дополнительным плюсом.

Ответы [ 8 ]

30 голосов
/ 10 марта 2017

Я отвечаю очень поздно, но это действительно полезно для нового читателя.Это очень простой и эффективный способ получить случайных допустимых имен .Для этого добавьте репозиторий maven в POM.xml

<dependency>
    <groupId>com.github.javafaker</groupId>
    <artifactId>javafaker</artifactId>
    <version>0.12</version>
</dependency>

и затем используйте класс Faker, как показано ниже в вашем коде Java

Faker faker = new Faker();

String name = faker.name().fullName();
String firstName = faker.name().firstName();
String lastName = faker.name().lastName();

String streetAddress = faker.address().streetAddress();

Попробуйте напечатать результат, используя стандартный System.out.println();

Для получения дополнительной информации Faker Lib

16 голосов
/ 17 февраля 2011
// class variable
final String lexicon = "ABCDEFGHIJKLMNOPQRSTUVWXYZ12345674890";

final java.util.Random rand = new java.util.Random();

// consider using a Map<String,Boolean> to say whether the identifier is being used or not 
final Set<String> identifiers = new HashSet<String>();

public String randomIdentifier() {
    StringBuilder builder = new StringBuilder();
    while(builder.toString().length() == 0) {
        int length = rand.nextInt(5)+5;
        for(int i = 0; i < length; i++) {
            builder.append(lexicon.charAt(rand.nextInt(lexicon.length())));
        }
        if(identifiers.contains(builder.toString())) {
            builder = new StringBuilder();
        }
    }
    return builder.toString();
}
8 голосов
/ 17 февраля 2011

Почему бы не использовать java.util.UUID? Он гарантированно генерирует уникальные идентификаторы, и он настолько же стандартен, как и получает: -).

2 голосов
/ 17 февраля 2011

Если вы разрешите Apache Commons lang ...

public String[] getRandomlyNames(final int characterLength, final int generateSize) {
    HashSet<String> list = new HashSet<String>();
    for (int i = 0; i < generateSize; ++i) {
        String name = null;
        do {
            name = org.apache.commons.lang.RandomStringUtils.randomAlphanumeric(
                    org.apache.commons.lang.math.RandomUtils.nextInt(characterLength - 1) + 1);
        while(list.contains(name));
        list.add(name);
    }
    return list.toArray(new String[]{});
}
1 голос
/ 02 марта 2016

У меня была такая же проблема, но мне нужна была произвольно длинная строка.Я придумал этот однострочный, не требующий внешней библиотеки, который даст вам 10 символов:

BigInteger.probablePrime(50, new Random()).toString(Character.MAX_RADIX)

Длина может быть изменена, вам нужно около 5 бит на символ.Что было сделано, так это отфильтровать и ограничить длину следующим образом (только строчные буквы и размер 10):

BigInteger.probablePrime(100, new Random()).
    toString(Character.MAX_RADIX).
    replaceAll("[0-9]", "").
    substring(0, 10) 

Недостаток: он немного медленный.

1 голос
/ 17 февраля 2011

Вы можете попробовать

Random rand = new Random();
Set<String> words = new HashSet<String>();
while(words.size() < 10000) 
    words.add(Long.toString(Math.abs(rand.nextLong() % 3656158440062976L), 36)));

Длинной константы вполне достаточно для 10 цифр, базовых 36 чисел.

1 голос
/ 17 февраля 2011

Самый простой и быстрый способ - создать перестановок определенной строки.Пока строка достаточно длинная, вы можете легко иметь 10000 уникальных перестановок.Хорошая вещь генерации перестановок заключается в том, что вам не нужно беспокоиться о дублировании.Если строка содержит все разные символы, она может генерировать n!перестановки (n - длина строки).Таким образом, строка с 8 различными символами может генерировать 40 320 различных перестановок.

В сети имеется много кода для генерации перестановок строки, например этой http://introcs.cs.princeton.edu/23recursion/Permutations.java.html.

Если вы хотите ихчтобы быть более случайным, вы можете использовать разные строки в качестве начального числа, такие как "abcde123", "efgh456" и т. д.

1 голос
/ 17 февраля 2011

Вы можете попытаться взять хэш md5 текущего времени, и вы получите «случайный» идентификатор в виде комбинации цифр и букв

...