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

zqdjd7g9  于 2021-07-09  发布在  Java
关注(0)|答案(5)|浏览(313)

我遇到了一些困难,想弄清楚如何在[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();
}

问题是:
请求20个生成的字符串时,每次返回“aaaaaaaa”字符串可能有200个符号的长度
预期产量:

A7898as7sd6as5da
as87asd67
768asjhg435GhA900324
2g2j3h4gjhgAKL*78a9dd879234
3B234
1

一些限制:
没有其他库(google guava或apache common)
仅限jdk 1.6
非常感谢你的贡献!

i5desfxk

i5desfxk1#

其他人则谈到了随机生成字符串。为了保证唯一性,可以使用字符串的哈希代码。如果两个字符串具有不同的哈希码,则保证它们不相同。在生成每个字符串时,将其哈希代码放入set/array/whatever中。如果散列码已经存在(不太可能,但可能),那么拒绝该特定字符串并生成替代字符串。
我不确定Java1.6中提供了什么,所以我不会编写任何实际的代码,但是这个想法并不难实现。

dced5bon

dced5bon2#

在你的队伍里 (int) random.nextFloat() * STRING_TOKENS.length() 你的智力施法将只适用于 random.nextFloat() 因为这个值在0.0和1.0之间,所以这个转换的结果几乎都是0,你的整个值也都是0(因为0*x是0)。
使用括号: (int) (random.nextFloat() * STRING_TOKENS.length()) 将强制转换应用于整个表达式。

4ngedf3f

4ngedf3f3#

使用 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;
vsikbqxv

vsikbqxv4#

试试这个!!!

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();
r1wp621o

r1wp621o5#

这条线:

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) {

相关问题