随机化单词中间的字母,同时保持第一个和最后一个字母不变

时间:2014-10-23 23:17:39

标签: java

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);
    }
}

我应该说一句话,把里面的字母洗牌,但保持第一个和最后一个字母不变。我设法随机化,但我不能阻止它重复。

5 个答案:

答案 0 :(得分:1)

你的方法是不正确的:当你随机选择中间字母时,不可能保证字母中间的所有字母都会打印出来(因此,其他字母也不会重复)。

有几种解决方法:

  1. 每次生成随机索引时,请在boolean s的数组中标记该索引。数组的长度等于单词的长度。在使用您生成的每个新索引之前检查数组;如果索引已标记,则继续生成新的随机索引,直到找到空索引。
  2. 在单词内创建一个字母整数索引数组(即1到length-1,包括1和1)。在数组上执行random shuffle,并使用混洗索引选择中间字母。
  3. 类似于2,除了你把所有中间字母都放在一个数组中,并将其洗牌。

答案 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());