使用随机字母实现马尔可夫算法直到字母组成字符串中的一个单词?

时间:2017-12-05 04:43:13

标签: java

我正在尝试使用马尔可夫链来显示随机字母,直到字母组成字符串中找到的单词之一。我认为我在正确的轨道上,但是当它到达一个单词时它不会停止它只是打印整个随机字符串。

我相信会检查字符是否与打印输出匹配,但不确定...

我在这里做错了什么?

public class Main {

    public static void main(String[] args) {

        final int NUMBER_OF_CHARS = 100000;
        String[] words = { "at", "is", "he", "we", "up", "on" };

        for (int i = 0; i < NUMBER_OF_CHARS; i++) {
            char ch = main.getRandomLowerCaseLetter();
            if ((i + 1) % 40 == 0)
                System.out.println(ch);
            else
                System.out.print(ch);
        }
    }

    public static char getRandomCharacter(char ch1, char ch2) {
        return (char)(ch1 + Math.random() * (ch2 - ch1 + 1));
    }

    public static char getRandomLowerCaseLetter() {
        return getRandomCharacter('a', 'z');
    }
}

2 个答案:

答案 0 :(得分:0)

我没有看到任何if语句检查字符是否已形成单词。换句话说,循环永远不会退出,因为你没有为它编写逻辑。

您可能希望将生成的每个字符存储在String中,如下所示:

String chars = "";
...
for(...){
    ...
    chars.append(ch);
    ...
}

你也应该写这样的东西来摆脱循环:

for(String word : words){
    if(chars.contains(word){
        break outerLoop;
    }
}

像这样标记外部for循环,这样break语句就会突破两个循环,而不仅仅是内部for循环:

outerLoop: while(...){}

答案 1 :(得分:0)

可能有更好的方法可以做到这一点,但这里有一些快速解决你的问题,正如Keara建议你需要存储每个角色,然后循环检查你是否找到了你的东西寻找。至于(在你给出的例子中)你要找的单词最多2个字符,这样每次找到无效组合时都可以很容易地重置字符串。

import java.util.ArrayList;
import java.util.List;

public class Test {

public static void main(String[] args) {

    final int NUMBER_OF_CHARS = 100000;
    String[] words = {"at", "is", "he", "we", "up", "on"};
    List<Character> characters = new ArrayList<>();
    for (int i = 0; i < NUMBER_OF_CHARS; i++) {
        char ch = getRandomLowerCaseLetter();
        characters.add(ch);

        if ((i + 1) % 40 == 0) {
            System.out.println(ch);
            if (contains(characters, words)) {
                System.exit(0);
            }
        } else {
            System.out.print(ch);
            if (contains(characters, words)) {
                System.exit(0);
            }
        }
    }
}

public static boolean contains(List<Character> characters, String[] words) {
    String st = "";
    int count = 0;
    for (Character c : characters) {
        st += c;
        count++;
        if (count == 2) {
            for (String s : words) {
                if (st.equals(s)) {
                    System.out.println(" Found: " + s);
                    return true;
                }
            }
            count = 0;
            st = "";
        }
    }
    return false;
}

public static char getRandomCharacter(char ch1, char ch2) {
    return (char) (ch1 + Math.random() * (ch2 - ch1 + 1));
}

public static char getRandomLowerCaseLetter() {
    return getRandomCharacter('a', 'z');
}
}

亲切的问候和愉快的节目!