2017-09-02 110 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); 
    }