所以我想制作一个字谜解码器,我想知道是否有更好的方法可以做到这一点。我当前的代码是这样:
Random random = new Random();
char[] splitAnagram = chosenAnagram.toCharArray();
int[] presetNumbers = new int[chosenAnagram.length()];
int i = 0;
while (true) {
TimeUnit.MILLISECONDS.sleep(10);
int thisRandom = random.nextInt(chosenAnagram.length());
if (Arrays.asList(presetNumbers).contains(thisRandom) == true)
presetNumbers[i] = thisRandom;
else
continue;
i++;
if (i > chosenAnagram.length())
break;
}
for (int l = 0; l < chosenAnagram.length(); l++) {
System.out.println(splitAnagram[presetNumbers[l]]);
}
基本上,它会为每个字母生成随机数,以便对单词“加扰”。它本身是有缺陷的,因为它甚至还不应该循环,只是进行一次加扰,但是一般而言它似乎确实很慢并且容易出错(我睡了10ms,因为它每次系统时间变化只能产生随机数)。
我想知道是否还有其他算法可以使用,或者可能使用的API。谢谢!
P.S我正在运行Eclipse Photon,以防您知道它的插件。
答案 0 :(得分:0)
我从Fisher--Yates Shuffle Stackoverflow帖子中找到了一种使用this的方法。代码的结果如下:
@SuppressWarnings("unchecked")
private void beginDecoding(String chosenAnagram) throws InterruptedException {
Random random = new Random();
List madeAnagrams = new ArrayList();
int factorial = 1;
for (int i = chosenAnagram.length(); i > 0; i--) {
factorial = i * factorial;
}
System.out.println(factorial);
while (true) {
if (madeAnagrams.size() == factorial) {
break;
}
TimeUnit.MILLISECONDS.sleep(10);
char[] splitAnagram = chosenAnagram.toCharArray();
for (int i = chosenAnagram.length() - 1; i > 0; i--) {
int index = random.nextInt(i + 1);
char letter = splitAnagram[index];
splitAnagram[index] = splitAnagram[i];
splitAnagram[i] = letter;
}
String returnAnagram = new String(splitAnagram);
if (!madeAnagrams.contains(returnAnagram)) {
madeAnagrams.add(returnAnagram);
System.out.println(returnAnagram);
}
else
continue;
}
}