2015-09-10 52 views
6

我需要用1000隨機字符在[a,..z][A,..,Z]之間初始化一個字符數組。隨機數組發生器Java

我不想這樣做,首先只生成[a,..z]之間的字符,然後只生成[A...Z]中的字符,但同等對待所有52個字符。

我知道這樣做的一種方法是生成一個介於0和51之間的隨機數併爲其分配一個字符值。

我該如何處理這個問題或將值賦給0到51之間的隨機數?

+0

我有一個大小爲1000的數組,其中包含整個字母表的大寫字母和小寫字母。 我將如何打印生成的小寫字母總數 和生成的大寫字母總數? ALSO 計算每個字母的生成數量(顯示該字母和生成的數量)以及該字母代表的總數的百分比。 – linyu21

回答

1

讓我給你一些一般的指導。你提到的「做到這一點的一種方法」。我建議使用HashMap<E>。您可以在文檔閱讀更多關於包含HashMap:

http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html

另外,也可以使用包含另一個數組 - z和A - Z,你可以使用索引號來指代他們。但在這種情況下,我認爲使用HashMap<E>更有意義。

我想你知道如何創建一個Random對象。但是,如果你不這樣做,檢查出的文檔:

http://docs.oracle.com/javase/7/docs/api/java/util/Random.html

所以你基本上使用Random類的nextInt方法來生成一個隨機數。您可以將該隨機數字放入您的HashMap或陣列中。然後,您只需將該字符放入存儲程序結果的數組中即可。

+0

如果你想訪問大量的隨機值,是不是一個壞主意? – HopefullyHelpful

+0

但我想對於初學者來說,你應該關心性能。在這種情況下,最有意義的是存儲我的鍵值對 – Sweeper

+1

嗯,我從來沒有使用HashSets,但他們似乎沒有檢索/ get方法,它會接受一個隨機值。那麼如何使用哈希集來創建隨機結果?我知道你可以使用HashMap,就像一個混合數組。但哈希集? – HopefullyHelpful

5

你有了有趣的代碼想法。 這裏可能是這個想法。

  1. 取出所有的a-z和A-Z並將它們存儲在一個數組[]中。
  2. 隨機生成1-52之間的數字(使用API​​類)。
  3. 您將在步驟2中獲得一個數字,將其作爲數組索引並從字符的array[]中挑選此索引。
  4. 選擇字符到你想要的位置/格式的地方............
  5. 處理它。

最好的問候。

+0

我填充了大小爲51的數組,然後用大寫字母和小寫字母的ascii數字填充它,然後我在我的第一個數組上使用隨機生成器來填充我的主數組1000的大小,那麼聲音 – linyu21

+0

第一階段是如何得到一個在1-52(az,AZ)範圍內的隨機字符,當你得到一個字符,然後在一個循環中將它填充到你的1000個數組索引中。 – shaun

0

這是樣品的工作,希望這會爲你工作

import java.util.ArrayList; 
import java.util.Random; 

public class RandomNumber { 

    public static void main(String args[]) { 
     char c; 
     ArrayList<Character> character = new ArrayList<Character>(); 
     Random rn = new Random(); 
     for (int i = 0; i < 500; ++i) { 

      character.add((char) (rn.nextInt(26) + 66)); 
      character.add((char) (rn.nextInt(26) + 97)); 
     } 

     System.out.println(character); 
    } 
} 
+0

這不是OP要求的。他/她不想單獨生成-Z和A-Z – Sweeper

0

最簡單的方法是:

// constant declared in the class 
static final int LETTERS_COUNT = 'z'-'a'+1; 

char[] randomChars = new char[500]; 
Random r = new Random(); 
for(int i=0; i<randomChars.length; i++) { 
    randomChars[i] = (char)(r.nextInt(LETTERS_COUNT) + (r.nextBoolean() ? 'a' : 'A')); 
} 

如果你不喜歡訪問的隨機數發生器兩次,你可從0到51生成數字:

for(int i=0; i<randomChars.length; i++) { 
    int num = r.nextInt(LETTERS_COUNT*2); 
    randomChars[i] = (char)(num >= LETTERS_COUNT ? 'a'+(num-LETTERS_COUNT) : 'A'+num); 
} 

但是我沒有看到這種做法的任何好處。內部r.nextInt也可能會多次更改其內部狀態。這兩種情況下的分佈應該是相似的。

0

你可以用一個函數使用數組或arithemtic。 請注意,由於數字(http://www.asciitable.com/)以字符形式存儲,因此您可以使用字符進行計算,您還會注意到數字,小寫字母和大寫字母按順序存儲,因此訪問範圍非常簡單,循環。

private Random r = new Random(); 
public char randomLetter() { 
    int randomNumber = this.r.nextInt(52); 
    if(randomNumber >= 26) { 
     return (char)(('A'+randomNumber)-26); 
    } else { 
     return (char)('a'+randomNumber); 
    } 
} 

使用陣列會更快版本,但是,如果該組可能的結果是足夠小,可以存儲僅可使用。

private Random r = new Random(); 
private static char[] set = new char[52]; //static because we only need 1 overall 
static { //this is a static "constructor" 
    for(int i = 0; i < 26; i++) { 
     set[i] = (char)('a'+i); 
     set[i+26] = (char)('A'+i); 
    } 
} 

public char fastRandomLetter() { 
    final int randomNumber = this.r.nextInt(52); 
    return set[randomNumber]; 
}