我创建了一个程序,该程序从用户处获取一个数字,并以用户输入的数量生成一个包含大写和小写字母(但没有其他字符)的字符数组,这些字符必须随机排列。换句话说,如果用户输入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); }}
答案 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]