Этот вопрос уже имеет ответ здесь:
Мне назвали объект Student
, и это имеет studentName
, studentId
, studentAddress
, и т.д. Для studentId
, Я должен генерировать случайную строку, состоят из семи числовых символов, например.
studentId = getRandomId();
studentId = "1234567" <-- from the random generator.
И я должен удостовериться, что нет никакого дублирующегося идентификатора.
Создать случайную строку символов легко - просто используйте 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);
}
Теперь для уникальности вам нужно где-то хранить сгенерированные строки. Как вы это сделаете, на самом деле будет зависеть от остальной части вашего приложения.
Думаю, вам поможет следующий код класса. Он поддерживает многопоточность, но вы можете сделать некоторые улучшения, например удалить блок синхронизации и синхронизировать с методом 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);
}
}
Вы также можете использовать класс UUID из пакета java.util, который возвращает случайный uuid из 32-битных символов String.
java.util.UUID.randomUUID () .toString ()
Множество возможностей ...
Вы ведь умеете генерировать целое число случайным образом, верно? Таким образом, вы можете сгенерировать из него char ... (ex 65 -> A)
Это зависит от того, что вам нужно, уровня случайности, задействованной безопасности ... но для школьного проекта, я думаю, подстрока UUID подойдет :)
Это очень хорошо:
http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/RandomStringUtils.html - что-то вроде RandomStringUtils.randomNumeric (7)
.
Существует 10 ^ 7 равновероятных (если java.util.Random
не нарушено) различных значений, поэтому уникальность может быть проблемой.
Первый вопрос, который вам нужно задать, - действительно ли вам нужен случайный идентификатор. Иногда достаточно последовательных идентификаторов.
Теперь, если вам нужно, чтобы она была случайной, сначала отметим, что сгенерированная последовательность чисел, не содержащая дубликатов, не может называться случайной. : p Теперь, когда мы разобрались с этим, самый быстрый способ сделать это - иметь Hashtable
или HashMap
, содержащий все уже сгенерированные идентификаторы. Всякий раз, когда создается новый идентификатор, сверяйте его с хэш-таблицей, повторно сгенерируйте, если идентификатор уже существует. Обычно это хорошо работает, если количество студентов намного меньше диапазона идентификаторов. В противном случае у вас более серьезные проблемы, поскольку увеличивается вероятность необходимости регенерировать идентификатор, P (сгенерировать новый идентификатор) = number_of_id_already_generated / number_of_all_possible_ids. В этом случае вернитесь к первому абзацу (нужно ли, чтобы идентификатор был случайным?).
Надеюсь, это поможет.