我正在尝试构建一个打印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以外的其他变量,玩弄数字等但我似乎无法找到抛出格式化的逻辑中的确切缺陷。任何帮助将不胜感激!
答案 0 :(得分:2)
您的逻辑问题在于,即使您不打印它,也会计算每个选定的字符。落在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);
}
}
答案 1 :(得分:0)
您在随机字符上添加的两个条件,即allLetters[i] <= 90
和allLetters[i] >= 97
,不会涵盖可能字符的整个间隔,在您的程序中,这些字符的间隔为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(',');
}
}
答案 2 :(得分:0)
我在看你的问题,并且有一个聪明的&#34;使用Java 8+ IntStream
和lambdas的解决方案。在int
和0
之间生成75个随机26
,将每个值映射到String
或{{1}的一个字符'a'
偏移量使用'A'
中的nextBoolean()
。将其收集到一个七十五个字符Random
。然后打印我们感兴趣的三个二十五个字符String
。赞,
substring