3 回答

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊
charray通過定義asCharacter[] charray并使其成為列表,您可以獲得更好的結(jié)果: 在方法List<Character> chars = Arrays.asList(charray);
中使用此列表:getRandomCharacter()
private char getRandomCharacter(){
Collections.shuffle(chars); // shuffle before each use
return chars.get(random(chars.size()));
}
當(dāng)然修復(fù)random:
private int random(int value){
return (int) System.nanoTime()% value;
}
輸出:
隨機(jī)行:tjnbuxtdetulhflqnejbrblxfqqikuyyrrezzwpwpwg
隨機(jī)行:mzpzjboycaqrarpsqpsqpsk 隨機(jī)
行:cezkcsnhtmovmt隨機(jī)行:

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超7個(gè)贊
您可以使用時(shí)序數(shù)據(jù)(除了其他數(shù)據(jù))來播種隨機(jī)數(shù)生成器,但僅使用時(shí)序數(shù)據(jù)來實(shí)現(xiàn)隨機(jī)性并不容易。這是可能的,但可能非常慢。例如,請(qǐng)參閱我在此處編寫的關(guān)于如何使用其他數(shù)據(jù)為安全隨機(jī)實(shí)例播種的代碼(H2 數(shù)據(jù)庫,MathUtils.generateAlternativeSeed)。它用:
System.currentTimeMillis()
System.nanoTime()
新對(duì)象().hashCode()
Runtime.freeMemory()、maxMemory()、totalMemory()
System.getProperties().toString()
網(wǎng)絡(luò)地址
更多計(jì)時(shí)數(shù)據(jù)
這是為了播種一個(gè)安全的偽隨機(jī)數(shù)生成器。這可以確保即使在沒有任何其他運(yùn)行、不知道當(dāng)前時(shí)間并且沒有 UI 的系統(tǒng)上也能獲得足夠的熵。
但是,如您所見,僅依賴時(shí)序數(shù)據(jù)是困難的,因?yàn)樗Q于操作系統(tǒng)、方法調(diào)用之間的時(shí)間、編譯器和硬件。

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超4個(gè)贊
僅使用時(shí)間是有問題的,因?yàn)樗拗屏四梢砸箅S機(jī)數(shù)的頻率,并且還非常依賴于實(shí)現(xiàn)。
更好的方法是將時(shí)間用作種子,然后使用偽隨機(jī)生成器,例如線性同余生成器。您在此答案中有更多信息。考慮到這種隨機(jī)數(shù)生成器算法并不安全,并且正如 Thomas 指出的那樣,如果您希望在所有系統(tǒng)中都使用安全的 RNG,那么僅使用時(shí)間作為種子可能還不夠。
因此,您的代碼可能如下所示:
private final char[] charray = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
private long seed;
private char getRandomCharacter() {
return charray[random(charray.length)];
}
private int random(int value) {
seed = (1103515245L * seed + 12345L) % 2147483648L;
return (int)seed%value;
}
protected Randomizer() {
boolean running = true;
int count = 0;
int max = 5;
seed = System.nanoTime();
while (running) {
StringBuilder sb = new StringBuilder();
int size = random(25) + random(25);
for (int i = 0; i < size; i++) {
sb.append(getRandomCharacter());
}
System.out.println("Random Line : " + sb.toString());
if (count++ == max) {
running = false;
System.out.println("All of them are random.");
}
}
}
public static void main(String[] args) {
new Randomizer();
}
添加回答
舉報(bào)