Вот фрагмент кода для случайной задачи (спасибо Eyal за то, что назвали его). Не уверен, что это то, что вы ищете.
Имейте в виду, что это решение попадет в бесконечный цикл, если в строке недостаточно строчных букв. Так что вам также нужно будет заняться этим, но я думаю, что это отправная точка. ; -)
String myString = "9aie3ra3nr23rr5r21t";
System.out.println(upperCaseRandom(myString, 10));
public static String upperCaseRandom(String input, int n) {
StringBuilder output = new StringBuilder(input);
Random r = new Random();
for (int i = 0; i < n; i++) {
// Pick a place
int position = r.nextInt(input.length());
// Check if lowercase alpha
if (Character.isLowerCase(output.charAt(position))) {
output.setCharAt(position, Character.toUpperCase(output.charAt(position)));
} else {
i--;
}
}
return output.toString();
}
Edit:
Вот улучшенная версия. Он действительно меняет ровно n строчных букв на заглавные (если их достаточно, иначе он меняет их все). Программа не сталкивается с бесконечными циклами, но, тем не менее, время выполнения является проблемой.
public static String upperCaseRandom(String input, int n) {
final int length = input.length();
final StringBuilder output = new StringBuilder(input);
final boolean[] alreadyChecked = new boolean[length];
final Random r = new Random();
for (int i = 0, checks = 0; i < n && checks < length; i++) {
// Pick a place
int position = r.nextInt(length);
// Check if lowercase alpha
if (!alreadyChecked[position]) {
if (Character.isLowerCase(output.charAt(position))) {
output.setCharAt(position, Character.toUpperCase(output.charAt(position)));
} else {
i--;
}
checks++;
alreadyChecked[position] = true;
} else {
i--;
}
}
return output.toString();
}