java随机生成唯一字符数组。我想知道为什么我原来的方法现在做得更好了
我应该生成一个随机排列的字母表。我知道一些洗牌方法和类似Fisher-Yates洗牌算法的东西,但我最初尝试的方法永远不会奏效。我有一个按规则顺序排列的字母表“参考”数组。然后每26个空间就有一个for循环。我将生成一个0到25之间的随机整数(用于引用数组中的索引)。然后,我将检查数组中是否已经有该字符(它必须是唯一的)。如果它是唯一的,我将其添加到数组中。但它仍然有重复的。这是我的密码:
public static final char[] ALPHABET = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z', ' '};
public static char[] cipherGenerator(){
char[] cipherAlpha = new char[26];
for(int index = 0; index < 26; index++){
Random rand = new Random();
int newLetter = rand.nextInt(25);
char newChar = ALPHABET[newLetter];
while(Arrays.asList(cipherAlpha).contains(newChar)){
newLetter = rand.nextInt(25);
newChar = ALPHABET[newLetter];
}
cipherAlpha[index] = newChar;
}
return cipherAlpha;
}
这将返回带有重复项的代码,尽管我尽了一切努力试图找到逻辑错误。提前感谢您的帮助
# 1 楼答案
当您将
char[]
之类的基元数组传递给Arrays.asList
时,该方法无法返回List<char>
,因为基元类型不允许作为类型参数。但是它可以而且确实产生一种List<char[]>
。您的随机char
永远不等于List
中的单个char[]
,因此允许任何重复的char
。如果对cipherAlpha
使用Character[]
而不是char[]
,并将方法的返回类型更改为Character[]
,那么Arrays.asList
将正确推断类型参数Character
,从而允许重复检查正常工作其次,
nextInt(25)
将在0
和24
之间生成一个随机索引,而不是25
。您可以使用ALPHABET.length
,这里是26。有了第一个变化,但没有这个变化,你将只有25个不同的字符,你永远不会找到第26个不同的字符,永远循环# 2 楼答案
在ArrayList中添加字母表,并在每次轮换时删除选定的元素。然后更新你的rand。nextInt-like:
你的字母表是:
# 3 楼答案
默认情况下,生成的随机数是重复的,为了克服这一问题,您可以继续向集合集中添加数字,直到获得所有唯一的数字
另一种方法是将所有整数添加到列表&;然后洗牌
如果您愿意,可以直接对角色进行洗牌