2013-12-12 20 views
33

Başlıktan anlaşılacağı gibi, 17 karakter uzunluğunda bir rasgele, kimlik oluşturmalıyım. "AJB53JHS232ERO0H1" gibi bir şey. Harf ve rakamların sırası da rasgele. A-Z harfleri ve 1-2'a rastlayan bir 'kontrol' değişkeni içeren bir dizi oluşturmayı düşündüm. Ve bir döngüde;Java'da A-Z ve 0-9 ile rastgele bir dize oluşturma

Randomize 'check' to 1-2. 
If (check == 1) then the character is a letter. 
Pick a random index from the letters array. 
else 
Pick a random number. 

Bunu yapmak için daha kolay bir yol varmış gibi hissediyorum. Var mı? Apache commons-lang dan

+2

http://stackoverflow.com/questions/41107/how-to-generate-a-random-alpha-numeric-string bir örnektir – aquaraga

+0

mektuplarınızı ve rakamlarınızı bir diziye ekleyebilir ve istediğiniz boyuta ulaşana kadar rastgele bir şekilde öğeleri seçebilirsiniz. – wxyz

cevap

66

Burada giriş amaçla bir tuz dize oluşturmak için kullanarak çantamda gelen Rastgele Dize

protected String getSaltString() { 
     String SALTCHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; 
     StringBuilder salt = new StringBuilder(); 
     Random rnd = new Random(); 
     while (salt.length() < 18) { // length of the random string. 
      int index = (int) (rnd.nextFloat() * SALTCHARS.length()); 
      salt.append(SALTCHARS.charAt(index)); 
     } 
     String saltStr = salt.toString(); 
     return saltStr; 

    } 

yukarıdaki yöntem üretmek için benim yöntemi kullanabilirsiniz. Kolayca döngü için ile yapabilirsiniz

+0

'StringBuffer'ı bir' StringBuilder' ile değiştirmeyi önerebilirim, iş parçacığı için güvenli bir eklentiye gerek yok. Burada –

+6

Veya tam olarak ne kadar uzun olacağını bildiğinizden dolayı bir "char []" oluşturun. Hiçbir şey eklemenize gerek yok. Ayrıca 'nextFloat'ı çağırmak yerine ve yerine göre çarpmak yerine' Random.nextInt' kullanıyorum. –

+1

Not: Ortalama sayıların harflerin miktarı ile aynı olmayacağını unutmayın. –

51

RandomStringUtils yardımcı olabilir:

RandomStringUtils.randomAlphanumeric(17).toUpperCase() 

2017 güncelleştirmesi: RandomStringUtils kullanımdan kaldırıldı, artık RandomStringGenerator kullanmalıdır.

+2

Yanıtın Apache ile değiştirildiğini, ortak metin içinde "RandomStringGenerator" ile değiştirmeyi düşünün. –

3

,

public static void main(String[] args) { 
    String aToZ="ABCD.....1234"; // 36 letter. 
    String randomStr=generateRandom(aToZ); 

} 

private static String generateRandom(String aToZ) { 
    Random rand=new Random(); 
    StringBuilder res=new StringBuilder(); 
    for (int i = 0; i < 17; i++) { 
     int randIndex=rand.nextInt(aToZ.length()); 
     res.append(aToZ.charAt(randIndex));    
    } 
    return res.toString(); 
} 
4

sizin işlevi uygulamak için üç adım:

Sen AZ ve 0- karakter içeren bir dize belirtebilirsiniz 1 Adım # 9.

Gibi.

String candidateChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; 

Sonra bu aday dize rastgele kömürü üretmek istiyorsanız Adım #. Sen Sonunda

candidateChars.charAt(random.nextInt(candidateChars.length())); 

Adım 3. kullanmak rastgele dize uzunluğu üretilecek belirtebilirsiniz (açıklamanıza, bu 17'dir). Bir for döngüsü yazıp, # 2 adımında StringBuilder nesnesine oluşturulan rastgele karakterleri ekleyin. Buna dayanarak

, burada genel sınıf RandomTest {

public static void main(String[] args) { 

    System.out.println(generateRandomChars(
      "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", 17)); 
} 

/** 
* 
* @param candidateChars 
*   the candidate chars 
* @param length 
*   the number of random chars to be generated 
* 
* @return 
*/ 
public static String generateRandomChars(String candidateChars, int length) { 
    StringBuilder sb = new StringBuilder(); 
    Random random = new Random(); 
    for (int i = 0; i < length; i++) { 
     sb.append(candidateChars.charAt(random.nextInt(candidateChars 
       .length()))); 
    } 

    return sb.toString(); 
} 

} 
İlgili konular