我正在尝试构建一个程序,打印75个随机大写和小写字母,每行25个。我认为我已经完成了所有逻辑,但每当我运行它时,格式化全部关闭,而不是每行打印25个字符,它会打印一个随机数。到目前为止,这是我的代码:
char allLetters[] = new char[3700];
for(int i = 1; i <= 75; i++) { //Begin for loop
int max = 122;
int min = 65;
allLetters[i] = (char)(Math.random() * (max - min) + min);
if(i % 25 != 0){
if (allLetters[i] <= 90) {
System.out.printf("%s,",allLetters[i]);
}
if (allLetters[i] >= 97) {
System.out.printf("%s,",allLetters[i]);
}
} //Close if
else {
if (allLetters[i] <= 90) {
System.out.printf("%s\n",allLetters[i]);
}
if (allLetters[i] >= 97) {
System.out.printf("%s\n",allLetters[i]);
}
}
} //End for
目前,输出类似于:
U,i,y,e,v,T,G,p,P,a,U,G,e,B,w,U,o,F,G,w,j,m,R
O,X,w,w,u,p,t,g,X,J,R,c,w,I,d,H,R,m,y,b,o
C,p,M,F,X,U,v,O,a,Y,F,E,x,s,x,k,C,b,D,R,r,H
我尝试使用除了i之外的不同变量,玩弄数字等但我似乎无法找到抛出格式化的逻辑中的确切缺陷。任何帮助将不胜感激!
您的逻辑问题在于,即使您不打印它,也会计算每个选定的字符。落在90和97之间的ASCII字符(不包括在内)不是字符,您可以正确地跳过它们。然而,循环仍在计算那些迭代,就像打印了一个有效的字母一样。这导致输出中的计数不正确。
下面的代码片段中使用的解决方法是继续在循环中拾取字符,直到我们实际获得小写或大写字母。只有这样,我们才能继续你以前的逻辑。
char allLetters[] = new char[3700];
int max = 122;
int min = 65;
for (int i = 1; i <= 75; i++) {
char next;
do {
next = (char)(Math.random() * (max - min) + min);
} while (next > 90 && next < 97);
allLetters[i] = next;
if (i % 25 != 0) {
System.out.printf("%s,", next);
}
else {
System.out.printf("%s\n", next);
}
}
您对随机字符的两个条件,即allLetters[i] <= 90
和allLetters[i] >= 97
,不包括可能字符的整个间隔,在您的程序中为65到122(包括65和122)。当生成91到96之间的字符时,您的程序不会打印任何内容。获得这六个随机字符之一的概率大约为10%,因此您可以打印21..23个字符。
如果你真的想跳过这六个字符,请使用while
循环而不是for
循环修复问题,并仅在打印时增加打印字符的计数器:
int printed = 0;
while (printed != 75) {
char ch = (char)(Math.random() * (max - min) + min);
if (ch >= 91 && ch <= 96) continue;
printed++;
System.out.print(ch);
if (printed % 25 == 0 {
System.out.println();
} else {
System.out.print(',');
}
}
我在看你的问题,而且有一个使用Java 8+ IntStream
和lambdas的“聪明”解决方案。在int
和0
之间生成75个随机26
,使用来自String
的'a'
将每个值映射到'A'
或nextBoolean()
偏移的单字符Random
。收集到一个七十五个字符String
。然后打印我们感兴趣的三个二十五个字符substring
。就像,
Random rand = new Random();
String s = IntStream.generate(() -> rand.nextInt(26)).limit(75)
.mapToObj(i -> Character.toString(
rand.nextBoolean() ? (char) (i + 'a') : (char) (i + 'A')))
.collect(Collectors.joining());
System.out.println(s.substring(0, 25));
System.out.println(s.substring(25, 50));
System.out.println(s.substring(50));