1

ランダム書き込みプログラム (テキスト ファイルの形式で入力を受け取る) の構造を概念的に理解し、マルコフ アルゴリズムを使用してやや賢明な出力を作成するのに少し問題がありました。

したがって、私が使用しているデータ構造は、0 ~ 10 の範囲のケースを使用することです。case 0:文字/記号または数字が表示される数字を数え、これに基づいて新しいテキストを作成し、入力をシミュレートします。入力テキスト内の一意の各文字とテキスト内の文字数の配列を保持する Map 型を使用して、これを既に実装しています。したがって、特定の文字の配列のサイズを尋ねるだけで、このように簡単に出力テキストを作成できます。

しかし、今度は case1/2/3 などを作成する必要があります... case 1 には、どの文字がどの文字の後に表示される可能性が最も高いかも含まれています。これらの場合に 10 個の個別の配列を作成する必要がありますか、それとももっと簡単な方法がありますか?

4

1 に答える 1

1

これをモデル化する方法はたくさんあります。1つのアプローチは、各インデックスがチェーン内の次の文字であり、最終結果がカウントである多次元配列を使用して、説明したとおりです。

# Two character sample:
int counts[][] = new int[26][26]
# ... initialize all entries to zero

# 'a' => 0, 'b' => 1, ... 'z' => 25
# For example for the string 'apple'
# Note: I'm only writing this like this to show what the result is, it should be in a
#       loop or function ...
counts['a'-'a']['p'-'a']++
counts['p'-'a']['p'-'a']++
counts['p'-'a']['l'-'a']++
counts['l'-'a']['l'-'e']++

次に、名前をランダムに生成するには、特定のキャラクターの合計結果の数 (例: 前の例では「p」の結果が 2 つ) を数え、可能な結果の 1 つに対して加重乱数を選択します。

小さいサイズ (たとえば最大 4 文字) の場合は、正常に動作するはずです。それよりも大きなものでは、(AZ を使用していると仮定して) N の長さのチェーンに対して 26^N のエントリがあるため、メモリの問題が発生し始める可能性があります。

数年前のようなことを書きました。ウィキペディアのランダムなページをシード データとして使用して重みを生成したと思います。

于 2012-11-18T17:27:57.467 に答える