2012-11-19 35 views
2

我使用馬爾科夫模型創建僞隨機文本生成器。基本上,我使用散列表來存儲順序k(馬爾科夫模型的順序)的子串的列表,然後對於每個子串,我有一個後綴的TreeMap以及它們在整個子串中的頻率。Java - 採用字符頻率,創建概率,然後生成僞隨機字符

我正在努力生成隨機後綴。對於每個子字符串,我有一個包含所有可能的後綴及其頻率的TreeMap。我在使用它爲每個後綴創建概率時遇到了麻煩,然後基於這些概率生成了僞隨機後綴。

任何關於這個概念的幫助,以及如何去做這件事表示讚賞。如果您有任何問題或需要澄清,請告訴我。

+0

這個問題主要是數學問題嗎? – durron597

+0

數學不是困難的部分。我知道如果一個後綴出現一次並且子字符串在文本中出現兩次,那麼它的概率是1/2,因此在文本生成器中出現1/2的時間。但是,手頭的問題是如何獲取這些信息,並從中產生一個「隨機」字符。 – user1547050

回答

1

我不確定TreeMap是否真的是最好的數據結構,但是。 。 。

您可以使用the Math.random() method獲取0.0(含)和1.0(不含)之間的隨機值。然後,迭代你的地圖元素,積累他們的頻率,直到你超過這個值。首先超過此值的後綴是您的結果。假設你的地圖元素的頻率全部合計爲1.0,這將選擇與它們的頻率成比例的所有後綴。

例如:

public class Demo 
{ 
    private final Map<String, Double> suffixFrequencies = 
     new TreeMap<String, Double>(); 

    private String getRandomSuffix() 
    { 
     final double value = Math.random(); 
     double accum = 0.0; 
     for(final Map.Entry<String, Double> e : suffixFrequencies.entrySet()) 
     { 
      accum += e.getValue(); 
      if(accum > value) 
       return e.getKey(); 
     } 
     throw new AssertionError(); // or something 
    } 

    public static void main(final String... args) 
    { 
     final Demo demo = new Demo(); 
     demo.suffixFrequencies.put("abc", 0.3); // value in [0.0, 0.3) 
     demo.suffixFrequencies.put("def", 0.2); // value in [0.3, 0.5) 
     demo.suffixFrequencies.put("ghi", 0.5); // value in [0.5, 1.0) 

     // Print "abc" approximately three times, "def" approximately twice, 
     // and "ghi" approximately five times: 
     for(int i = 0; i < 10; ++i) 
      System.out.println(demo.getRandomSuffix()); 
    } 
} 

注:

  • 由於舍入誤差,則可能throw new AssertionError()實際上發生,每隔一段時間,儘管非常罕見。所以我建議你用一些總是選擇第一個元素或最後一個元素或某物的東西來替換該行。
  • 如果頻率不是全部合計爲1.0,那麼您應該在getRandomSuffix()的開頭處添加一個合格的合格數來確定所有頻率的總和。然後您可以相應地縮放value
+0

謝謝,我不知道entrySet()是什麼,這使得這個過程變得簡單很多。 – user1547050

+0

@ user1547050:不客氣!我建議你閱讀[java.util.TreeMap'的Javadoc](http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html);你可能會發現其他有用的東西。 (更普遍的是,我建議檢查你打算使用的課程的Javadoc的習慣,通常會有驚喜,無論是好的還是壞的。) – ruakh