Java 生成特定长度范围内的唯一字符串
我遇到了一些困难,无法找出如何生成[1;200)范围长度内的唯一字符串。我产生的代码附在下面:Java 生成特定长度范围内的唯一字符串,java,arrays,string,random,generator,Java,Arrays,String,Random,Generator,我遇到了一些困难,无法找出如何生成[1;200)范围长度内的唯一字符串。我产生的代码附在下面: public static String generateRandString() { String STRING_TOKENS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"; StringBuilder stringBuilder = new StringBuilder();
public static String generateRandString() {
String STRING_TOKENS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
StringBuilder stringBuilder = new StringBuilder();
Random random = new Random();
while(stringBuilder.length() <= 200) {
int index = (int) random.nextFloat() * STRING_TOKENS.length();
stringBuilder.append(STRING_TOKENS.charAt(index));
}
return stringBuilder.toString();
}
一些限制:
int index = (int) random.nextFloat() * STRING_TOKENS.length();
在这里,您在乘法之前将random.nextFloat()
强制转换为int
,因此总是以0*某物
结尾。添加一些括号:
int index = (int) (random.nextFloat() * STRING_TOKENS.length());
或者更好地使用nextInt
:
int index = random.nextInt(STRING_TOKENS.length());
如果还要随机化字符串的长度,请滚动另一个数字,以便在
while
循环中的条件中使用:
int max = random.nextInt(200);
while(stringBuilder.length() <= max) {
int max=random.nextInt(200);
而(stringBuilder.length()在您的行(int)random.nextFloat()*STRING\u TOKENS.length()
中,您的int强制转换将仅应用于random.nextFloat()
,由于该值介于0.0和1.0之间,因此该强制转换的结果几乎总是0,并且您的整个值也将是0(因为0*X是0)
使用括号:(int)(random.nextFloat()*STRING_TOKENS.length())
将强制转换应用于整个表达式。使用int index=random.nextInt(STRING_TOKENS.length());
在Java 1.7或更高版本中,生成随机int值的标准方法如下所示,但在特定范围内:
import java.util.concurrent.ThreadLocalRandom;
// nextInt is normally exclusive of the top value,
// so add 1 to make it inclusive
int randomNum = ThreadLocalRandom.current().nextInt(min, max + 1);
看
在Java 1.7之前
int randomNum = random.nextInt((max - min) + 1) + min;
试试这个
for (int i = 0; i < 10; i++)
System.out.println(randomString(ThreadLocalRandom.current().nextInt(0, 200)));
static String randomString(int len) {
String AB = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
Random rnd = new Random();
StringBuilder sb = new StringBuilder(len);
for (int i = 0; i < len; i++)
sb.append(AB.charAt(rnd.nextInt(AB.length())));
return sb.toString();
}
其他人谈到了创建随机字符串。为了保证唯一性,您可以使用字符串的哈希代码。如果两个字符串具有不同的哈希代码,则保证它们不相同。生成每个字符串时,将其哈希代码放入集合/数组/任何内容中。如果哈希代码已经存在(不太可能,但可能)然后拒绝该特定字符串并生成替代字符串
我不确定Java 1.6中提供了什么,因此我不会编写任何实际的代码,但这一想法并不难实现。这只是需要注意的一点,但请注意,您的方法无法保证字符串的唯一性。考虑到字符串的长度为200,这是非常不可能的,但可能会得到足够接近的随机序列从random.nextFloat()
中生成的值,您将从STRING\u令牌中获取相同的字符。提示:(int)random.nextFloat()*STRING\u令牌.length()
与((int)random.nextFloat())*STRING\u令牌.length()相同
这确实有效!但我如何接收长度范围为[1;200]的字符串?如果Random可以用min,max生成,那就太好了。@Reborn因为您可以用max值生成,您只需通过基本数学和执行int rnd=min+Random.nextInt(max-min)即可从最小值生成最大值
,所以如果你想生成100-200之间的数字,你可以只做100+随机。nextInt(100)
@MikeAdamenko为1.7编写代码可能会更容易,但限制条件……好主意。我来试试。
for (int i = 0; i < 10; i++)
System.out.println(randomString(ThreadLocalRandom.current().nextInt(0, 200)));
static String randomString(int len) {
String AB = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
Random rnd = new Random();
StringBuilder sb = new StringBuilder(len);
for (int i = 0; i < len; i++)
sb.append(AB.charAt(rnd.nextInt(AB.length())));
return sb.toString();
}
import java.util.UUID;
String uuid = UUID.randomUUID().toString();