仅生成随机字母字符

时间:2019-07-18 04:24:05

标签: java

我创建了一个程序,该程序从用户处获取一个数字,并以用户输入的数量生成一个包含大写和小写字母(但没有其他字符)的字符数组,这些字符必须随机排列。换句话说,如果用户输入5,则程序将生成5个随机的小写/大写字母,如果用户输入25,则程序将生成25个字母,以此类推。 我的程序几乎完全成功,除了无法找到只生成大小写字母的好方法。它还会生成91-96字符([,\,],^,_,'),我不想要它们。

我尝试了一段时间和if语句来尝试删除不需要的字符,以及在Math.random公式中,将58替换为“ desiredChars.length”,该字符具有所有所需的字符,但似乎无济于事。

// Program to generate random chars. 
Scanner sc = new Scanner(System.in);
System.out.println("This program will print an array of random letters based on your specified array size. \nPlease enter your desired array size: ");
int number = sc.nextInt();  
char[] arrayList = new char[number];
int i;
int lowercaseCount = 0;
int uppercaseCount = 0;
// final char[] desiredChars = {'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'Z', 'X', 'C', 'V', 'B', 'N', 'M'};    


for (i = 0; i < arrayList.length; i++) {
arrayList[i] = (char) ((65 + Math.random()*(58)));
if (Character.isLowerCase(arrayList[i])) {lowercaseCount++;}
if (Character.isUpperCase(arrayList[i])) {uppercaseCount++;}}

System.out.println("Your array with " + number + " random letter(s) is below:\n"+ Arrays.toString(arrayList));
System.out.println("The number of lowercase in your array is " + lowercaseCount);
System.out.println("The number of lowercase in your array is " + uppercaseCount); }}

3 个答案:

答案 0 :(得分:2)

您可以按以下方式编辑for循环:循环直到获得所需的内容。我们生成一个随机字母。如果它不在我们想要的范围内,那么我们会循环直到它达到我们想要的范围。

注意。尽管概率很小,但理论上我的答案会引起无限循环。

for (i = 0; i < arrayList.length; i++) {
    int randChar = (int) (65 + Math.random() * (58));
    while (randChar >= 91 && randChar <= 96) {
        randChar = (int) (65 + Math.random() * (58));
    }
    arrayList[i] = (char) randChar;
    if (Character.isLowerCase(arrayList[i])) {lowercaseCount++;}
    if (Character.isUpperCase(arrayList[i])) {uppercaseCount++;}
}

@tibrogargan的建议的解释。这比循环直到获得结果要好。基本思想是先生成一个大写字母,然后向其随机添加0或32。加0将不做任何改变,而加32将使其小写。它不会引起无限循环。以下代码可用于生成随机字母字符。

char c = (char) ('A' + (char)(Math.random()*26) + Math.round(Math.random()) * ('a' - 'A'));

答案 1 :(得分:0)

首先生成字母集合。

 private static void appendCharacterRange(List<Character> list, char from, char to) {
    for (char c=from; c<=to; c++){
        list.add(c);
    }
 }

  private static List<Character> getNRandomLetters(int n){
    List<Character> list = new LinkedList<>();
    appendCharacterRange(list, 'a', 'z');
    appendCharacterRange(list, 'A', 'Z');
    Collections.shuffle(list);
    List<Character> result = new LinkedList<>();
    if (n<list.size()){
        return list.subList(0, n);
    }
    for (int i=0; i<=n; i=i+list.size()) {
        result.addAll(list.subList(0, i+result.size()>n?n-result.size():list.size()));
        Collections.shuffle(list);
    }
    return result;
}

答案 2 :(得分:0)

这是一种方法,它使用包含所有可能字符的静态字符串:

String uppers = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
String all = uppers + uppers.toLowerCase();

int number = sc.nextInt();  
char[] arrayList = new char[number];

Random rand = new Random();

for (int i=0; i < number; ++i) {
    int position = rand.nextInt(all.length());
    arrayList[i] = all.charAt(position);
}

System.out.println(Arrays.toString(arrayList));

对于输入number=10,生成了以下输出:

[L, q, s, q, i, U, H, p, u, I]