我需要用1000
隨機字符在[a,..z]
和[A,..,Z]
之間初始化一個字符數組。隨機數組發生器Java
我不想這樣做,首先只生成[a,..z]
之間的字符,然後只生成[A...Z]
中的字符,但同等對待所有52個字符。
我知道這樣做的一種方法是生成一個介於0和51之間的隨機數併爲其分配一個字符值。
我該如何處理這個問題或將值賦給0到51之間的隨機數?
我需要用1000
隨機字符在[a,..z]
和[A,..,Z]
之間初始化一個字符數組。隨機數組發生器Java
我不想這樣做,首先只生成[a,..z]
之間的字符,然後只生成[A...Z]
中的字符,但同等對待所有52個字符。
我知道這樣做的一種方法是生成一個介於0和51之間的隨機數併爲其分配一個字符值。
我該如何處理這個問題或將值賦給0到51之間的隨機數?
讓我給你一些一般的指導。你提到的「做到這一點的一種方法」。我建議使用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
或陣列中。然後,您只需將該字符放入存儲程序結果的數組中即可。
如果你想訪問大量的隨機值,是不是一個壞主意? – HopefullyHelpful
但我想對於初學者來說,你應該關心性能。在這種情況下,最有意義的是存儲我的鍵值對 – Sweeper
嗯,我從來沒有使用HashSets,但他們似乎沒有檢索/ get方法,它會接受一個隨機值。那麼如何使用哈希集來創建隨機結果?我知道你可以使用HashMap,就像一個混合數組。但哈希集? – HopefullyHelpful
你有了有趣的代碼想法。 這裏可能是這個想法。
array[]
中挑選此索引。最好的問候。
這是樣品的工作,希望這會爲你工作
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);
}
}
這不是OP要求的。他/她不想單獨生成-Z和A-Z – Sweeper
最簡單的方法是:
// 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
也可能會多次更改其內部狀態。這兩種情況下的分佈應該是相似的。
你可以用一個函數使用數組或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];
}
我有一個大小爲1000的數組,其中包含整個字母表的大寫字母和小寫字母。 我將如何打印生成的小寫字母總數 和生成的大寫字母總數? ALSO 計算每個字母的生成數量(顯示該字母和生成的數量)以及該字母代表的總數的百分比。 – linyu21