2017-09-02 111 views
-2

我想写下代码以从预定义的字符串中生成5个字符的随机字符串。在Java中生成随机字符串,而不使用随机类或方法直接用于字符串

我的目标是创建一个长度为5的字符串数组,并将所有5个随机字符串存储在此数组中。

所以,到目前为止,我已经写了下面的代码:

public static String generateRandomString(int stringlength, String fullstring){ 
     //Generating random number which will use to pick character from provider string at index[i] 
     int i =((int)(Math.random()*100)); 

     //Created a character array to store the characters picked up from provided String 
     char [] randomString = new char[5]; 

     //Checking the condition if generated random number is greater than or equals to string length to avoid OutOfBoundException 
     if (i>=stringlength){ 
      generateRandomString(stringlength, fullstring); 
     } 
     //Else Fetching the character from provided string and storing it into Char[] 
     else 
     { 

       randomString [0] = (fullstring.charAt(i)); 
       randomString [1] = (fullstring.charAt(i)); 
       randomString [2] = (fullstring.charAt(i)); 
       randomString [3] = (fullstring.charAt(i)); 
       randomString [4] = (fullstring.charAt(i)); 
     } 
     //Converting Char[] to String. 
     String returnString = new String(randomString); 

     //Returning String 
     return returnString; 

    } 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     //String Array to Store Random Strings 
     String [] array = new String[5]; 

     //Provided String 
     String fullstring = "abcdefghijklmnopqrstuvwxyz"; 
     int stringlength = fullstring.length(); 

     //Loop to store random strings into all indexes of String[] 
     for(int j=0;j<5;j++){ 

     array[j]=generateRandomString(stringlength, fullstring); 
     } 

     //Printing Final String[] 
     for(String var:array){ 
      System.out.println(var); 
     } 

    } 

但我现在面临两个问题:

  1. 我希望我的随机字符串不仅仅包含单个字符,我当前的代码对所有5个地方只挑选一个角色。因为它取一个值(i)。我想将(i)中的值更改为char []中每个存储了一个索引的字符后的任意随机值。

例如,

我正在“AAAAA”为一个随机字符串,但我想像“auzje”

  • 当我打印最终的字符串[],有时我正在NULL字符串在我的输出。
  • 例如, “”

    “AAAAA”

    “”

    “GGGGG”

    “IIIII”

    什么我终于寻找的是:

    “ ajsuh“

    “ldugj”

    “odueb”

    “mcnde”

    “yahnf”

    请建议。

    很多谢谢。

    +2

    'randomString [0] =(fullstring.charAt(I)); randomString [1] =(fullstring.charAt(i)); randomString [2] =(fullstring.charAt(i)); randomString [3] =(fullstring.charAt(i)); randomString [4] =(fullstring.charAt(i));'是你的罪魁祸首。尝试调试为什么... – nullpointer

    回答

    1

    您可以更改

    if (i>=stringlength){ 
        generateRandomString(stringlength, fullstring); 
    } else { // this is where you're saving all similar characters to the array 
        randomString [0] = (fullstring.charAt(i)); 
        randomString [1] = (fullstring.charAt(i)); 
        randomString [2] = (fullstring.charAt(i)); 
        randomString [3] = (fullstring.charAt(i)); 
        randomString [4] = (fullstring.charAt(i)); 
    } 
    

    randomString [0] = (fullstring.charAt((int)(Math.random()*100) % stringlength)); 
    randomString [1] = (fullstring.charAt((int)(Math.random()*100) % stringlength)); 
    randomString [2] = (fullstring.charAt((int)(Math.random()*100) % stringlength)); 
    randomString [3] = (fullstring.charAt((int)(Math.random()*100) % stringlength)); 
    randomString [4] = (fullstring.charAt((int)(Math.random()*100) % stringlength)); 
    

    虽然代码可以进一步进行清洗和抽象,但应从fullstringchar[]的不同指标分配随机字符。

    +1

    它完全适用于我..但我仍然没有得到我想念的东西,对不起,但我是新来的Java。你可以多谈一些我编写的mycode中的错误。谢谢。 – Shan

    +0

    正如您的代码块的评论中所述。你使用'i'的同一个常量值来存储'randomString []'的不同索引中的字符,因此同一个字符的重复次数是5次。 – nullpointer

    +0

    是的,但是为什么它在打印数组时发出NULL字符串(从我的查询中发布第2期)? – Shan

    0

    您需要为每个输出符号生成一个新字符。假设您使用的是Java 8+,则可以从输入fullstring生成一个Stream随机字符 - 将其限制为stringlength,然后收集到String;像,

    public static String generateRandomString(int stringlength, String fullstring) { 
        return Stream.generate(() -> Character.toString(fullstring.charAt(// 
          (int) (Math.random() * fullstring.length())))) // 
          .limit(stringlength).collect(Collectors.joining()); 
    } 
    

    然后,调用它时,再次产生随机五个字符的String(S),并限制在需要的5种String(S)和最后收集。使用阵列也许是有点麻烦,但可以像

    public static void main(String[] args) { 
        String fullstring = "abcdefghijklmnopqrstuvwxyz"; 
        String[] r = Stream.generate(() -> generateRandomString(5, fullstring)) // 
          .limit(5).collect(Collectors.toList()).toArray(new String[5]); 
        System.out.println(Arrays.toString(r)); 
    } 
    
    0

    一个简单的但有点存储器饿方式这样做是通过定义可接受的字符数组,并通过使用随机类采摘索引来实现或的Math.random()

    实施例:

    String randomString(int length, char[] chars) 
    { 
         char[] result = new char[length]; 
         Random rand = new Random(); 
         for(int x = 0; x < length; x++) 
          result [x] = chars [Math.abs(rand.nextInt())%chars.length]; 
         return new String(result); 
    }