我有一个名为 Student
的对象,它有 studentName
、studentId
、studentAddress
等属性。对于 studentId
,我需要生成七个数字字符的随机字符串,例如:
studentId = getRandomId();
studentId = "1234567" <-- from the random generator.
我必须确保没有重复的id。
生成一个随机字符串很容易 - 只需使用 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);
}
现在,为了保证唯一性,您需要将生成的字符串存储在某个地方。如何存储将取决于您应用程序的其余部分。
UUID.randomUUID().toString()
比使用其他方式更正确吗?如果是的话,为什么? - IsaacRandom
实际上是一个依赖项 - 在此接受它允许调用者决定是否使用预先种子化的Random
以获得可重复的结果(例如用于测试),或者使用SecureRandom
使其适用于安全目的等。 - Jon Skeet这很棒:
http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/RandomStringUtils.html-类似于RandomStringUtils.randomNumeric(7)
。
如果java.util.Random
没有问题,那么有10^7个等概率(equiprobable)的不同值,所以唯一性可能是一个关注点。
java.util.UUID.randomUUID().toString()
http://java.sun.com/j2se/1.5.0/docs/api/java/util/UUID.htmlRandom 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);
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);
}
}
你需要先问自己一个问题,你是否真的需要ID是随机的。有时,顺序ID已经足够好了。
现在,如果你确实需要它是随机的,我们首先注意到一个不包含重复数字的生成数列不能被称为随机的。:p 现在我们把这个搞定了,最快的方法是使用一个Hashtable
或HashMap
来包含所有已经生成的ID。每当生成一个新的ID时,检查它是否在哈希表中,如果已经存在,则重新生成。如果学生人数远小于ID范围,这通常会很有效。如果不是,你就会陷入更深的麻烦,因为需要重新生成ID的概率会增加,P(生成新ID)=已生成的ID数量/所有可能ID的数量。在这种情况下,请回到第一段(你是否需要ID是随机的?)。
希望这可以帮助到你。
许多可能性...
你知道如何随机生成一个整数吧? 因此,你可以从中生成一个字符...(例如65 -> A)
这取决于你需要什么,随机程度,涉及的安全性...但对于学校项目来说,我想获取UUID子字符串就足够了 :)
Long.toHexString(Double.doubleToLongBits(Math.random()));
将随机生成的Double类型数字转换为16进制字符串。UUID.randomUUID().toString();
生成唯一标识符(UUID)并将其转换为字符串。RandomStringUtils.randomAlphanumeric(16);
生成长度为16的随机字母数字字符串。