我试着说一句话,把它分开,然后用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; }
答案 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
。
假设我们从:
开始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
是第一选择。如果我们交换a
和e
:
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时,无法保证您不会覆盖之前放置的字母。