Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试在随机字母中混合字符串字符_Java_Arrays_String - Fatal编程技术网

Java 尝试在随机字母中混合字符串字符

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 =

我试着把一个单词拆开,然后在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; }
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
^ ^ . . . .