我在如何在范围[1; 200]长度内生成唯一字符串时遇到了一些困难。到目前为止我所做的并不完全符合我的预期。
源代码:
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();
}
每次“AAAAAAAA”字符串可能长度为200个符号
时,请求返回20个生成的字符串预期产出:
A7898as7sd6as5da
as87asd67
768asjhg435GhA900324
2g2j3h4gjhgAKL*78a9dd879234
3B234
1
一些限制:
需要协助。
答案 0 :(得分:3)
使用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);
请参阅javadoc
在Java 1.7之前
int randomNum = random.nextInt((max - min) + 1) + min;
答案 1 :(得分:3)
试试这个!!!
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.util.UUID
import java.util.UUID;
String uuid = UUID.randomUUID().toString();
答案 2 :(得分:2)
这一行:
int index = (int) random.nextFloat() * STRING_TOKENS.length();
在此,您在乘法之前将random.nextFloat()
投射到int
,因此总是以0 * something
结束。添加一些括号:
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) {
答案 3 :(得分:2)
在你的行(int) random.nextFloat() * STRING_TOKENS.length()
中,你的int强制转换只会应用于random.nextFloat()
,因为这个值介于0.0和1.0之间,那个强制转换的结果几乎总是0,你的整个值将是0同样(因为0 * X是0)。
使用括号:(int) (random.nextFloat() * STRING_TOKENS.length())
将强制转换应用于整个表达式。
答案 4 :(得分:1)
其他人谈到制作随机字符串。为了保证唯一性,您可以使用字符串的哈希码。如果两个字符串具有不同的哈希码,则保证它们不相同。生成每个字符串时,将其哈希代码放入set / array / whatever。如果哈希码已经存在(不太可能但可能),则拒绝该特定字符串并生成替代字符。
我不确定Java 1.6中有什么可用,所以我不会写任何实际的代码,但这个想法并不难实现。