如何在Java中生成随机string
我有一个名为Student
的对象,它有studentName
, studentId
, studentAddress
等。对于studentId
,我必须生成由七个数字字符组成的随机string,例如。
studentId = getRandomId(); studentId = "1234567" <-- from the random generator.
我必须确保没有重复的ID。
生成一个随机的string很容易 – 只需使用java.util.Random
和一个包含所有你想要的字符的string,例如
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); }
现在,为了唯一性,您需要将生成的string存储在某处。 你如何做到这一点将取决于你的应用程序的其余部分。
这非常好:
如果你想要唯一性(很可能)考虑使用MD5或SHA散列。
您也可以使用java.util包中的UUID类,它返回32位string的随机uuid。
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);
你需要问的第一个问题是你是否真的需要这个ID是随机的。 有时候,连续的ID是足够好的。
现在,如果你需要它是随机的,我们首先注意到一个生成的数字序列,不包含任何重复不能被称为随机。 :p现在我们把它弄明白了,最快的方法是使用一个Hashtable
或HashMap
包含所有已经生成的ID。 每当生成一个新的ID时,请根据散列表检查它,如果ID已经出现,则重新生成。 如果学生人数远远低于身份证的范围,这一般会奏效。 如果不是,则需要重新生成一个ID的概率增加P(产生新的ID)= number_of_id_already_generated / number_of_all_possible_ids会带来更大的麻烦。 在这种情况下,请检查第一段(你是否需要ID是随机的?)。
希望这可以帮助。
许多可能性…
你知道如何随机生成一个整数吗? 你可以从中产生一个字符…(例65 – > A)
这取决于你需要什么,随机性的水平,所涉及的安全性…但是对于一个学校项目,我猜得到UUID子string会适合:)
我认为以下课程代码将帮助你。 它支持multithreading,但你可以做一些改进,如删除同步块和同步到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); } }