2

マルコフ モデルを使用して疑似ランダム テキスト ジェネレーターを作成しています。基本的に、ハッシュ テーブルを使用して k 次数 (マルコフ モデルの次数) の部分文字列のリストを格納します。次に、部分文字列ごとに、部分文字列全体の頻度を含むサフィックスの TreeMap を作成します。

ランダムサフィックスの生成に苦労しています。部分文字列ごとに、考えられるすべてのサフィックスとその頻度を含む TreeMap があります。これを使用して各サフィックスの確率を作成し、確率に基づいて疑似ランダムサフィックスを生成するのに問題があります。

これの概念とこれを行う方法についての助けをいただければ幸いです。ご不明な点やご不明な点がございましたら、お気軽にお問い合わせください。

4

1 に答える 1

1

aTreeMapが本当にこれに最適なデータ構造であるかどうかはわかりませんが、. . .

このメソッドを使用して、Math.random()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
于 2012-11-19T22:16:21.120 に答える