如何在Java中生成随机字符串[重复]
Posted
技术标签:
【中文标题】如何在Java中生成随机字符串[重复]【英文标题】:How to generate a random String in Java [duplicate] 【发布时间】:2011-02-21 06:34:13 【问题描述】:我有一个名为Student
的对象,它有studentName
、studentId
、studentAddress
等。对于studentId
,我必须生成由七个数字字符组成的随机字符串,
例如。
studentId = getRandomId();
studentId = "1234567" <-- from the random generator.
而且我必须确保没有重复的 id。
【问题讨论】:
如果我没看错你的问题,你想生成一个随机数 R 使得 1,000,000 先生成随机数再转成字符串会不会更容易? 那么,家庭作业做得怎么样了? 我猜这 3 个单行代码非常有用..Long.toHexString(Double.doubleToLongBits(Math.random()));
UUID.randomUUID().toString();
RandomStringUtils.randomAlphanumeric(16);
在有限的数据维度下如何确保唯一性?如果学生人数超过 10^7,您将无法为每个学生分配唯一编号。
【参考方案1】:
生成随机字符串很容易 - 只需使用 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);
现在,为了唯一性,您需要将生成的字符串存储在某处。您如何做到这一点实际上取决于您的应用程序的其余部分。
【讨论】:
@chandra:是的,没错。给它一个你想从中选择的字符的字符串。因此,如果您只想要数字,您可以输入“0123456789”。如果你只想要大写字母,你可以传入 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 等。 这比使用UUID.randomUUID().toString()
更正确吗?如果是,为什么?
@Is7aq:嗯,它提供了对输出的更多控制,包括使用哪些字符以及字符串的长度。
你为什么将 Random 作为参数传递?
@RockOnGom:抱歉,我之前错过了这条评论。对于这样的事情,我认为Random
实际上是一个依赖项——在这里接受它允许调用者决定是否使用预置的Random
来获得可重复的结果(例如用于测试),SecureRandom
使其适合出于安全目的等。【参考方案2】:
这很好:
http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/RandomStringUtils.html - 类似于RandomStringUtils.randomNumeric(7)
。
有 10^7 个等概率(如果 java.util.Random
没有损坏)不同的值,因此唯一性可能是一个问题。
【讨论】:
http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/RandomStringUtils.html 坏了!!! 安全哈希不是为了唯一性,是为了隐藏初始值【参考方案3】:您还可以使用 java.util 包中的 UUID 类,它返回 32 位字符串的随机 uuid。
java.util.UUID.randomUUID().toString()
http://java.sun.com/j2se/1.5.0/docs/api/java/util/UUID.html
【讨论】:
不过,这与“7 个数字字符的随机字符串”不同。 随机 UUID 基本上保证是唯一的。如果您需要其中的数字字符串,请对其进行哈希处理。【参考方案4】: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);
【讨论】:
【参考方案5】:我认为以下课程代码会对您有所帮助。它支持多线程,但您可以做一些改进,例如删除同步块并同步到 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);
【讨论】:
【参考方案6】:您需要问的第一个问题是您是否真的需要 ID 是随机的。有时,顺序 ID 就足够了。
现在,如果您确实需要它是随机的,我们首先要注意生成的不包含重复的数字序列不能称为随机。 :p 现在我们已经解决了这个问题,最快的方法是使用包含所有已生成 ID 的 Hashtable
或 HashMap
。每当生成新 ID 时,对照哈希表检查它,如果 ID 已经出现则重新生成。如果学生人数远少于 ID 的范围,这通常会很好地工作。如果没有,随着需要重新生成 ID 的可能性增加,您将陷入更深的麻烦,P(generate new ID) = number_of_id_already_generated / number_of_all_possible_ids。在这种情况下,请查看第一段(是否需要随机 ID?)。
希望这会有所帮助。
【讨论】:
是的,它必须是随机的,这就是我的项目规范所说的【参考方案7】:许多可能性...
你知道如何随机生成一个整数吗? 因此,您可以从中生成一个字符...(例如 65 -> A)
这取决于您需要什么、随机性级别、所涉及的安全性...但是对于学校项目,我想获得 UUID 子字符串会适合 :)
【讨论】:
是的,它只是一个学校项目,所以我不需要担心安全性和其他东西,但是 UUID 产生 32char 字符串,我只需要 7 .. 我刚刚有了一个想法,是否有可能只取 32 中的第 7 个字符? 使用子字符串...我说的是:)以上是关于如何在Java中生成随机字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章