1

C#でマルコフ モデルを使用して乱数を生成するにはどうすればよいですか? ここで、マルコフ アルゴリズムのほとんどすべてのアプリケーションが、テキストをランダムに書くことにあることに気付きました。これがどのように機能するかを完全に理解できるソースコードまたはチュートリアルはどこかにありますか? 私の目標は、実際には乱数を生成して太陽エネルギーの収穫をシミュレートすることです。

4

1 に答える 1

1

最初に、マルコフ モデルの深さを決定します。前の数字見てみ?前の 2 つの数字は?前の 3 つの数字は?もしかしてもっと深い?

次に、実際の太陽エネルギー データを調べて、1、2、または 3 つの数字のグループに続く確率を抽出します。完全にカバーできることが理想ですが、ギャップがあるかもしれません。それらについては、外挿するか、平均/ランダム値を入れます。

ここまではすべてデータです。

3 番目は、最初の 1、2、または 3 の数字を生成します。データベースから正しい組み合わせを選択し、可能性のあるフォロワーの 1 つをランダムに選択します。これを行うと、低確率のランダム要素も可能になるため、マンネリに陥ることはありません。

1、2、または 3 の数字の最初の要素を削除します。他の番号を下に移動し、最後に新しい番号を追加します。十分なデータが得られるまで繰り返します。

これは、データ テーブルの一部を示す、私の 1 層マルコフ ワード ジェネレーターからの短い抜粋です。

// The line addEntry('h', "e 50 a 23 i 12 o  7 @ 100") shows the the letter
// 'h' is followed by 'e' 50% of the time, 'a' 23% of the time, 'i' 12% of 
// the time, 'o' 7% of the time and otherwise some other letter, '@'.
//
// Figures are taken from Gaines and tweaked. (see 'q')
private void initMarkovTable() {
    mMarkovTable = new HashMap<Character, List<CFPair>>(26);

    addEntry('a', "n 21 t 17 s 12 r 10 l  8 d  5 c  4 m  4 @ 100");
    addEntry('b', "e 34 l 17 u 11 o  9 a  7 y  5 b  4 r  4 @ 100");
    addEntry('c', "h 19 o 19 e 17 a 13 i  7 t  6 r  4 l  4 k  4 @ 100");
    addEntry('d', "e 16 i 14 a 14 o 10 y  8 s  6 u  5 @ 100");
    addEntry('e', "r 15 d 10 s  9 n  8 a  7 t  6 m  5 e  4 c  4 o  4 w 4 @ 100");
    addEntry('f', "t 22 o 21 e 10 i  9 a  7 r  5 f  5 u  4 @ 100");
    addEntry('g', "e 14 h 14 o 12 r 10 a  8 t  6 f  5 w  4 i  4 s  4 @ 100");
    addEntry('h', "e 50 a 23 i 12 o  7 @ 100");
    // ...
}

データは、文字と頻度のペアとして編成されます。「@」文字を使用して、「ここで任意の文字を選択する」ことを示しました。代わりに、データは数と頻度のペアになります。

出力を選択するには、データの適切な行を読み取り、ランダムなパーセンテージを生成します。蓄積された頻度がランダムな割合を超えるまで、頻度を蓄積するデータを長くスキャンします。それがあなたが選んだ文字(またはあなたの場合は数字)です。

于 2013-02-05T16:51:40.283 に答える