Java 尝试在随机字母中混合字符串字符
我试着把一个单词拆开,然后在12个随机字母中混合 有人知道为什么这个代码5次中只有3次有效吗?当它不起作用时,它只会丢失本应存在的1或2个字母 多谢各位Java 尝试在随机字母中混合字符串字符,java,arrays,string,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 =
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; }
public静态字符串MixWordWithLetters(字符串字){
随机r=新随机();
字符串字符=“abcdefghijklmnopqrstuvxyz”;
字符[]文本=新字符[12];
对于(int i=0;i<12;i++)
{
text[i]=characters.charAt(r.nextInt(characters.length());
}
字符串随机字母=新字符串(文本);
char[]wrd=word.toCharArray();
char[]rl=randomletters.toCharArray();
对于(int i=0;i
在此循环中
for (int i = 0; i < 12; i++)
{
text[i] = characters.charAt(r.nextInt(characters.length()));
}
考虑无序数组的第一个元素。它需要从集合{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中
到5。现在只需要从索引1到5之间选择下一个元素
假设下一个选择的是b
,因此它与自身交换:
e b c d a f
^ ^ . . . .
不,剩下的元素在索引2到5处。该算法可以一直以这种方式运行,直到索引4,此时整个数组将被洗牌。因为元素交换可以让您轻松地跟踪剩余的元素,在适当的位置洗牌数组更容易
如果您查看JDK源代码,您将看到这一点。我不确定您的问题是什么,但我可以大胆猜测一下。 字符数组文本[]的长度为12。 假设输入的字小于该值
当您在wrd中循环并将字符放入rl中时,无法保证您不会覆盖以前放入的字母。样式说明--不要对变量名使用CamelCase标识符。Java风格是将其保存为类和接口的名称。dang完全忽略了这一点,感谢您为我们指出了这一点me@IceSteve很乐意帮忙!如果你需要一个指针来说明如何在洗牌时正确地保持状态,请再次发表评论。如果你能为我指出正确的方向,说明如何完成洗牌this@IceSteve使用或编写洗牌函数。如果您不反对切换到集合而不是数组,那么有一个函数。更新了有关洗牌数组的说明。
e b c d a f
^ ^ . . . .