使用Java争夺一个词

5 java shuffle

我想要争夺一个字符串,使其不可读,所以想出了这个方法:

public String scrambleWord(String start_word){

     char[] wordarray = start_word.toCharArray();

        char[] dummywordarray = start_word.toCharArray();

        Random random = new Random();

        int r = random.nextInt(wordarray.length-1);
        int i = 0;

        int j = r+1;

        while(i <= r){

            dummywordarray[wordarray.length -i-1] = wordarray[i];

            i++;
        }


        while (j <= wordarray.length -1){

            dummywordarray[j-r-1] = wordarray[j];

            j++;

        }

        String newword = String.valueOf(dummywa);



        return newword;
Run Code Online (Sandbox Code Playgroud)

所以我首先将字符串转换为char数组,在我的方法中,我不得不复制char数组"dummywordarray".通过这个算法,每个字母都会改变位置.但它不会被很好地打乱,因为你可以一眼就把它重新组合在一起.因此我通过该方法传递了一个少于9个字符的给定字符串7次,并且这些单词被很好地加扰,即不可读.但我尝试了30个字符的字符串,它花了500遍,然后才能保证它很好地加扰了.500!我确信有一个更好的算法,我想要一些建议:a)改进这种方法或b)更好的方法.

Mar*_*ers 19

怎么样

ArrayList<Character> chars = new ArrayList<Character>(word.length());
for ( char c : word.toCharArray() ) {
   chars.add(c);
}
Collections.shuffle(chars);
char[] shuffled = new char[chars.size()];
for ( int i = 0; i < shuffled.length; i++ ) {
   shuffled[i] = chars.get(i);
}
String shuffledWord = new String(shuffled);
Run Code Online (Sandbox Code Playgroud)

换句话说,您可以利用现有java.util.Collections.shuffle(List)方法.不幸的是,你必须跳过几个箍来使用它,因为你不能在泛型中使用原语.

编辑:

有效的基本方法shuffle(请参阅Javadoc的完整说明),如下所示:

for position = last_index to first_index
   let swap_pos = random number between first_index and position, inclusive
   swap(swap_pos, position)
Run Code Online (Sandbox Code Playgroud)

编辑2:

使用Guava的Chars实用程序,这种方法明显不那么冗长:

List<Character> chars = Chars.asList(word.toCharArray());
Collections.shuffle(chars);
String shuffledWord = new String(Chars.toArray(chars));
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这是一个Knuth shuffle或Fisher-Yates shuffle.http://en.wikipedia.org/wiki/Shuffling#Randomization (2认同)