2017-12-05 8 views
0

マルコフチェーンを使用して、文字が文字列内の単語の1つを構成するまでランダムな文字を表示しようとしています。私は正しい軌道に乗っていると思いますが、1つの単語に達したときに停止するのではなく、ランダムな文字列全体を表示します。ランダムな文字を使用してマルコフのアルゴリズムを実装します。

私は文字がプリントアウトと一致しますが、わからない...私はここで間違って

何をしているのですか?どうかを確認するためのチェックがあるだろうと信じて

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'); 
    } 
} 
+0

https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – shmosel

+0

コードを正しい字下げでフォーマットして読みやすくしてください。 – Keara

+0

コードをインデントしました。 – chatlover

答えて

0

文字がまだ単語を構成していないかどうかを確認するif文はありません。言い換えれば、あなたがそれを行うためのロジックを書いていないので、ループは決して終了しません。

あなたは、おそらくこのように、あなたが行くように文字列では、あなたが生成する各文字を格納したい:

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

あなたはまた、ループから抜け出すためにこのような何かを書く必要があります。

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

このようにouter forループにラベルを付けると、内側のforループだけでなく、両方のループからbreak文が外れます。

outerLoop: while(...){} 
0

おそらくもっと良い方法がありますが、ここであなたの問題を解決する素早い方法があります。ケアによって提案されているように、あなたはそれぞれのキャラクターを保存し、ループして、あなたが探しているものを見つけたかどうかを確認する必要がありますために。 (あなたがとにかく与えた例では)あなたが探している言葉は最大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'); 
} 
} 

種類親切と幸せなプログラミング!

関連する問題