在特定长度范围内生成唯一字符串

时间:2017-07-14 15:40:22

标签: java arrays string random generator

我在如何在范围[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

一些限制:

  1. 无其他库使用
  2. 应使用Java 1.6
  3. 编写

    需要协助。

5 个答案:

答案 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中有什么可用,所以我不会写任何实际的代码,但这个想法并不难实现。