如何在 Java 中生成随机字符串

我有一个叫做 Student的对象,它有 studentNamestudentIdstudentAddress等等。对于 studentId,我必须生成由7个数字字符组成的随机字符串, 例如。

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

我必须确保没有重复的 ID。

241059 次浏览

生成一个随机的字符串很容易——只需使用 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);
}

现在,为了获得唯一性,您需要将生成的字符串存储在某个地方。如何做到这一点实际上取决于应用程序的其余部分。

您需要问的第一个问题是您是否真的需要 ID 是随机的。有时候,连续的 ID 就足够了。

现在,如果你确实需要它是随机的,我们首先注意到一个生成的数字序列,不包含重复不能被称为随机。: p 现在我们已经完成了这个步骤,最快的方法是使用一个包含已经生成的所有 ID 的 HashtableHashMap。无论何时生成一个新 ID,都要根据散列表检查它,如果 ID 已经出现,则重新生成。如果学生的数量远远小于 ID 的范围,这通常会很好地工作。如果没有,那么随着需要重新生成 ID 的可能性增加,您将陷入更深的麻烦中,P (生成新 ID) = number _ of _ ID _ already _ generated/number _ of _ all _ may _ ids。在这种情况下,请检查第一段(您需要 ID 是随机的吗?).

希望这个能帮上忙。

还可以使用 java.util 包中的 UUID 类,该包返回32位字符 String 的随机 UUID。

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

Http://java.sun.com/j2se/1.5.0/docs/api/java/util/uuid.html

很多可能性。

你知道怎么随机生成一个整数吧? 因此,您可以从它生成一个 char... (ex65-> A)

这取决于你需要什么,随机性的程度,涉及到的安全性... ... 但是对于一个学校项目,我想得到 UUID 子串是适合的:)

我想下面的类代码会对你有所帮助。它支持多线程,但是您可以做一些改进,比如删除同步块和同步到 getRoughId ()方法。

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


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