2010-04-13 32 views

Trả lời

69

Có nhiều cách để thực hiện điều này, nhưng có, nó liên quan đến việc tạo ngẫu nhiên int (sử dụng ví dụ: java.util.Random.nextInt) và sau đó sử dụng để ánh xạ tới char. Nếu bạn có một bảng chữ cái cụ thể, sau đó một cái gì đó như thế này là tiện lợi:

import java.util.Random; 

    //... 

    Random r = new Random(); 

    String alphabet = "123xyz"; 
    for (int i = 0; i < 50; i++) { 
     System.out.println(alphabet.charAt(r.nextInt(alphabet.length()))); 
    } // prints 50 random characters from alphabet 

Do lưu ý rằng java.util.Random thực sự là một pseudo-random number generator dựa trên khá yếu linear congruence formula. Bạn đã đề cập đến nhu cầu mật mã; bạn có thể muốn điều tra việc sử dụng cryptographically secure pseudorandom number generator mạnh hơn trong trường hợp đó (ví dụ: java.security.SecureRandom).

+0

Cảm ơn, đó thực sự là một giải pháp ngắn gọn nếu bạn muốn tạo ra một tập hợp các ký tự được xác định. Đối với toàn bộ bảng chữ cái [câu trả lời của dogbane] (http: // stackoverflow.com/a/2627801/1845976) ngắn hơn một chút. Bạn có thể tăng hiệu quả và khả năng đọc một chút bằng cách sử dụng mảng. Xem [ví dụ hex] của tôi (http://stackoverflow.com/a/20345686/1845976). – schnatterer

1

Bạn đã hiểu. Chỉ cần tự tạo mã ASCII ngẫu nhiên. Những gì bạn cần nó cho dù?

+0

Tôi có thuật toán cần tạo chuỗi ngẫu nhiên và áp dụng chúng như "khóa" cho xor so với các chuỗi khác, như bạn làm trong chức năng mã hóa. Đây là những gì nó sẽ được sử dụng cho – Chris

0

Hãy xem Java Randomizer lớp học. Tôi nghĩ bạn có thể ngẫu nhiên hóa một ký tự bằng cách sử dụng phương thức ngẫu nhiên (mảng char].

+0

@manuel, tôi nghĩ rằng sau đó chúng ta cần phải cài đặt các tập tin jar Liefra, nó không đi kèm với một mặc định – gmhk

-2
Random randomGenerator = new Random(); 

    int i = randomGenerator.nextInt(256); 
    System.out.println((char)i); 

Nên quản lý những gì bạn muốn, giả sử bạn xem '0,' 1 ',' 2 '.. làm ký tự.

+1

Điều này rất có thể không phải là những gì đã được dự định, bởi vì trong phạm vi đó bạn bao gồm một số lượng toàn bộ các ký tự điều khiển mà rất ít khả năng được mong đợi. –

1

Bạn có thể sử dụng máy phát điện từ Quickcheck specification-based test framework.

Để tạo chuỗi sử dụng ngẫu nhiên anyString.

String x = anyString(); 

Bạn có thể tạo chuỗi từ nhóm ký tự hạn chế hơn hoặc với giới hạn kích thước tối thiểu/tối đa.

Thông thường bạn sẽ chạy thử nghiệm với nhiều giá trị:

@Test 
public void myTest() { 
    for (List<Integer> any : someLists(integers())) { 
    //A test executed with integer lists 
    } 
} 
102

Để tạo một char ngẫu nhiên trong az:

Random r = new Random(); 
char c = (char)(r.nextInt(26) + 'a'); 
+3

Bạn thậm chí có thể đi xa hơn và '(char) (r.nextInt ('z' - 'a') + 'a')' nếu bạn không chắc chắn có bao nhiêu chữ cái trong bảng chữ cái. –

+0

@AmirEldor sẽ không bao giờ tạo ra z, vì ''z' - 'a' == 25', không phải là 26. –

+0

Điểm tốt. Nên được cố định bằng dấu '+ 1'. Cảm ơn. –

2

sử dụng dollar:

Iterable<Character> chars = $('a', 'z'); // 'a', 'b', c, d .. z 

cho chars bạn có thể xây dựng phạm vi ký tự "xáo trộn":

Iterable<Character> shuffledChars = $('a', 'z').shuffle(); 

sau đó lấy ký tự đầu tiên n, bạn nhận được một chuỗi ngẫu nhiên có độ dài n. Các mã cuối cùng chỉ đơn giản là:

public String randomString(int n) { 
    return $('a', 'z').shuffle().slice(n).toString(); 
} 

NB: điều kiện n > 0 được cheched bởi slice

EDIT

như Steve một cách chính xác chỉ ra, randomString sử dụng tối đa một lần mỗi chữ cái.Như workaround bạn có thể lặp lại các bảng chữ cái m lần trước khi cuộc gọi shuffle:

public String randomStringWithRepetitions(int n) { 
    return $('a', 'z').repeat(10).shuffle().slice(n).toString(); 
} 

hoặc chỉ cung cấp bảng chữ cái của bạn như String:

public String randomStringFromAlphabet(String alphabet, int n) { 
    return $(alphabet).shuffle().slice(n).toString(); 
} 

String s = randomStringFromAlphabet("00001111", 4); 
+1

Điều này sẽ sử dụng từng ký tự nhiều nhất một lần trong chuỗi ngẫu nhiên. Đây có thể không phải là những gì mà OP cần. –

+0

@Steve: cảm ơn, tôi đã sửa câu trả lời của mình và mở rộng thư viện http://bitbucket.org/dfa/dollar/changeset/4c26ccf9464e/ – dfa

7
private static char rndChar() { 
    int rnd = (int) (Math.random() * 52); // or use Random or whatever 
    char base = (rnd < 26) ? 'A' : 'a'; 
    return (char) (base + rnd % 26); 

} 

Tạo giá trị trong dãy a-z, A-Z.

+1

Làm thế nào để '(char) (base + rnd% 26)' hoạt động chính xác? Có phải vì thêm một char vào một int chuyển đổi char thành số ASCII của nó? –

+2

@ Lèsemajesté - Yep đó là lý do. Mỗi 'char' cũng có thể chuyển đổi thành int, vì vậy 'a' có thể được coi là giá trị số nguyên (97), và sau đó bù trừ bằng cách nói 3 sẽ mang lại 100 khi chuyển đổi thành' char' là 'd'. –

46

Bạn cũng có thể sử dụng RandomStringUtils từ dự án Apache Commons:

RandomStringUtils.randomAlphabetic(stringLength); 
3

Trong sau giá trị 97 ascii nhỏ "a".

public static char randomSeriesForThreeCharacter() { 
Random r = new Random(); 
char random_3_Char = (char) (97 + r.nextInt(3)); 
return random_3_Char; 
} 

trong số trên 3 cho a, b, c, d và nếu u muốn tất cả các nhân vật như a đến z sau đó bạn thay thế 3 số đến 25.

0

polygenelubricants' answer cũng là một giải pháp tốt nếu bạn chỉ muốn tạo giá trị Hex:

/** A list of all valid hexadecimal characters. */ 
private static char[] HEX_VALUES = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'A', 'B', 'C', 'D', 'E', 'F' }; 

/** Random number generator to be used to create random chars. */ 
private static Random RANDOM = new SecureRandom(); 

/** 
* Creates a number of random hexadecimal characters. 
* 
* @param nValues the amount of characters to generate 
* 
* @return an array containing <code>nValues</code> hex chars 
*/ 
public static char[] createRandomHexValues(int nValues) { 
    char[] ret = new char[nValues]; 
    for (int i = 0; i < nValues; i++) { 
     ret[i] = HEX_VALUES[RANDOM.nextInt(HEX_VALUES.length))]; 
    } 
    return ret; 
} 
2

Chuỗi abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

char letter = abc.charAt (rd.nextInt (abc.length()));

một này hoạt động cũng

+0

Ý tưởng hay để đặt các ký tự có thể có trước đây. –

0

Nếu bạn không nhớ thêm một thư viện mới trong mã của bạn, bạn có thể tạo nhân vật với MockNeat (từ chối trách nhiệm: Tôi là một trong các tác giả).

MockNeat mock = MockNeat.threadLocal(); 

Character chr = mock.chars().val(); 
Character lowerLetter = mock.chars().lowerLetters().val(); 
Character upperLetter = mock.chars().upperLetters().val(); 
Character digit = mock.chars().digits().val(); 
Character hex = mock.chars().hex().val(); 
+2

toàn bộ thư viện để đơn giản nhận được một char ngẫu nhiên? –

0

Hãy thử điều này ..

public static String generateCode() { 

    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    String fullalphabet = alphabet + alphabet.toLowerCase() + "123456789"; 
    Random random = new Random(); 

    char code = fullalphabet.charAt(random.nextInt(9)); 

    return Character.toString(code); 

} 
0

tôi đề nghị để tạo chuỗi ngẫu nhiên với trường hợp hỗn hợp như: "DthJwMvsTyu".
Thuật toán này dựa trên mã ASCII của các chữ cái khi mã số a-z (97 đến 122) và A-Z (65 đến 90) khác nhau ở bit thứ 5 (2^5 hoặc 1 < < 5 hoặc 32).

random.nextInt(2): kết quả là 0 hoặc 1.

random.nextInt(2) << 5: kết quả là 0 hoặc 32.

Upper A là 65 và thấp hơn a là 97. Sự khác biệt chỉ là trên chút 5th (32) để cho tạo char ngẫu nhiên chúng ta thực hiện nhị phân OR '|' ngẫu nhiên charCaseBit (0 hoặc 32) và mã ngẫu nhiên từ A đến Z (65 đến 90).

public String fastestRandomStringWithMixedCase(int length) { 
    Random random = new Random(); 
    final int alphabetLength = 'Z' - 'A' + 1; 
    StringBuilder result = new StringBuilder(length); 
    while (result.length() < length) { 
     final char charCaseBit = (char) (random.nextInt(2) << 5); 
     result.append((char) (charCaseBit | ('A' + random.nextInt(alphabetLength)))); 
    } 
    return result.toString(); 
} 
+2

vui lòng thêm thông tin để hiểu rõ hơn và rõ ràng hơn. https://stackoverflow.com/help/how-to-answer –

+0

@PragatiSingh, vâng, tôi đã chỉnh sửa nhận xét và thêm một số mô tả. –

Các vấn đề liên quan