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

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

我遇到了一些困难,无法找出如何生成[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();
}
一些限制:

  • 没有其他库(Google Guava或Apache Common)
  • 仅限JDK 1.6
  • 非常感谢您的贡献!

    这一行:

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