试图用随机字母混合字符串字符

时间:2012-04-19 01:13:55

标签: java arrays string

我试着说一句话,把它分开,然后用12个随机字母混合。

有谁知道为什么这段代码只能用于5次中的3次?当它不起作用时,它只缺少1或2个字母。

谢谢

public static String MixWordWithLetters(String word) {
Random r = new Random();

String characters = "abcdefghijklmnopqrstuvwxyz";  
char[] text = new char[12];
for (int i = 0; i < 12; i++)
{
    text[i] = characters.charAt(r.nextInt(characters.length()));
}
String randomletters = new String(text);

char[] wrd = word.toCharArray();
char[] rl = randomletters.toCharArray();

for (int i = 0; i < wrd.length; i++) {
    int rand = (int) (Math.random() * rl.length);
    rl[rand] = wrd[i] ;
}

 String WordMixed = new String(rl);
return WordMixed; }

2 个答案:

答案 0 :(得分:2)

在这个循环中,

for (int i = 0; i < 12; i++) 
{
    text[i] = characters.charAt(r.nextInt(characters.length()));
}

考虑当r.nextInt(characters.length())在两次不同的迭代中返回相同的数字时会发生什么。

同样适用于另一个循环中的Math.random() * rl.length

数组shuffler需要跟踪哪些元素已经被洗牌

假设我们从:

开始
a b c d e f

考虑混洗数组的第一个元素。它需要从集{a, b, c, d, e, f}中随机挑选,每个元素的概率为1/6。

混洗数组的第二个元素需要从{a, b, c, d, e, f} - {shuffled[0]}中随机选取,即原始数组的所有元素,减去第一个位置的选择,这次是1/5概率。

同样,第三个元素来自{a, b, c, d, e, f} - {shuffled[0], shuffled[1]},每个元素的概率为1/4,依此类推。

如果您正在对阵列就地进行洗牌,那么您可以通过交换来移动元素,最终会自动跟踪剩余的元素。说e是第一选择。如果我们交换ae

,请看看会发生什么
e b c d a f
^ . . . . .

由于拾取的元素已移至索引0,因此所有剩余元素现在都位于索引1中 现在,需要从索引1到5之间选择下一个元素。

我们接下来选择b,因此它与自己交换:

e b c d a f
^ ^ . . . .

否则我们在索引2到5处有剩余的元素。算法可以保持这种方式直到索引4,此时整个数组将被洗牌。因为元素交换可以让您轻松跟踪剩余的内容,可以更容易地对阵列进行随机播放

如果查看JDK源代码,您会看到Collections.shuffle() does the same thing, with one optimization

答案 1 :(得分:1)

我不确定你的问题是什么,但我会猜测。 char数组text []长12个。 假设传入的单词小于那个?

当您遍历wrd并将字符放入rl时,无法保证您不会覆盖之前放置的字母。