import java.util.Scanner;
/**
*
* @author Cutuk
*/
public class JavaApplication3 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
String a;
Scanner in = new Scanner (System.in);
a = in.nextLine();
char first = a.charAt(0);
System.out.print(first);
int v= a.length()-1;
char last = a.charAt(v);
int k= a.length();
int random=0;
char x='\u0000';
char middle= '\u0000' ;
for (int i=1; i<a.length()-1;i++){
random= (int )(Math.random() * (k-2) + 1);
middle=a.charAt(random);
x=middle;
System.out.print(x);
}
System.out.print(last);
}
}
我应该说一句话,把里面的字母洗牌,但保持第一个和最后一个字母不变。我设法随机化,但我不能阻止它重复。
答案 0 :(得分:1)
你的方法是不正确的:当你随机选择中间字母时,不可能保证字母中间的所有字母都会打印出来(因此,其他字母也不会重复)。
有几种解决方法:
boolean
s的数组中标记该索引。数组的长度等于单词的长度。在使用您生成的每个新索引之前检查数组;如果索引已标记,则继续生成新的随机索引,直到找到空索引。答案 1 :(得分:0)
如果我理解了您的问题,建议您首先构建List<Character>
,然后使用Collections.shuffle(List)
,最后使用StringBuilder
来构建返回String
private static String shuffleLetters(String in) {
if (in == null || in.length() < 3) {
return in;
}
char first = in.charAt(0);
char last = in.charAt(in.length() - 1);
List<Character> chars = new ArrayList<>();
for (char ch : in.substring(1, in.length() - 1).toCharArray()) {
chars.add(ch);
}
Collections.shuffle(chars);
StringBuilder sb = new StringBuilder();
sb.append(first);
for (char ch : chars) {
sb.append(ch);
}
sb.append(last);
return sb.toString();
}
答案 2 :(得分:0)
您只需创建List<Integer>
即可存储您生成的随机数。
以下是您上面的代码,已清理,有意义的命名以及用于查找历史记录的List
:
public class Main {
public static void main(String[] args) {
final Scanner in = new Scanner(System.in);
final Random rnd = new Random(System.currentTimeMillis());
final List<Integer> rndHistory = new LinkedList<>(); // <-- your history
System.out.print("Please type a word: ");
final String input = in.nextLine();
System.out.print(input.charAt(0));
for (int i = 1, random = 0; i < input.length() - 1; i++) {
do {
random = rnd.nextInt(input.length() - 2) + 1;
} while (rndHistory.contains(random)); // check the history
rndHistory.add(random); // add to the history
System.out.print(input.charAt(random));
}
System.out.println(input.charAt(input.length() - 1));
}
}
主要差异:
final Random rnd = new Random(System.currentTimeMillis());
使用
the java.util.Random类是更好的生成方式
随机数。final List<Integer> rndHistory = new LinkedList<>();
这是实际的差异,是防止双重混乱的机制的一部分System.out.print("Please type a word: ");
有意义的提示
用户(当你编程时,他将知道该做什么
执行并且屏幕上什么都没有?)最后:
do {
random = rnd.nextInt(input.length() - 2) + 1;
} while (rndHistory.contains(random)); // check the history
rndHistory.add(random); // add to the history
'防止随机数被使用两次'机制
答案 3 :(得分:0)
假设&#34;洗牌&#34;可以允许中间字符有时与自己交换,你可以做类似的事情:
private static final String[] TEST_WORDS = {"apple", "banana", "pear", "raspberry", "cucumber", "watermelon", "a", "ab", "", null};
public static void main(String[] args)
{
for (String word: TEST_WORDS)
{
System.out.println(shuffleInside(word));
}
}
private static String shuffleInside(String word)
{
String ret = word;
if (word != null)
{
Random r = new Random();
int strLen = word.length();
if (strLen > 2)
{
char[] middleChars = word.substring(1, strLen - 1).toCharArray();
shuffle(middleChars, r);
ret = word.charAt(0) + new String(middleChars) + word.charAt(strLen - 1);
}
}
return ret;
}
private static void shuffle(char[] chars, Random r)
{
for (int i = chars.length - 1; i > 0; i--)
{
int index = r.nextInt(i + 1);
char c = chars[index];
chars[index] = chars[i];
chars[i] = c;
}
}
它处理单词为null,一个字符,两个字符或两个或更多字符的情况,并在一次运行中产生以下输出:
apple
bnaana
paer
rerrsbpay
cbuemucr
waomteerln
a
ab
null
答案 4 :(得分:-1)
对于你的随机试试这个:Random generator = new Random(System.currentTimeMillis());