3

率直に言って、私の数学的スキルを超えた何かを実装する方法について考えてきました。ですから、私が感謝している完全なコードソリューションではなく、自由に試して正しい方向に向けてください。

では、テキストを分析して、さまざまな 2 文字の組み合わせの頻度の表を作成したとします。これらを 26x26 配列に格納しました。例えば。

  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A 1 15 (frequency of AA, then frequency of AB etc.)
B 12 0 (freq of BA, BB etc..)
... etc.

したがって、これらの2文字の組み合わせをランダムに選択したいのですが、頻度に基づいて選択を「重み付け」したいと思います。すなわち。上記のABは、AAよりも15倍「可能性が高い」はずです。そして、明らかに、選択は BB のようなものを返すべきではありません (つまり、0 の頻度 - この例では、明らかに BB は Bubble!! :-) のような単語で発生します)。0 の場合、0 以外の頻度になるまでループできることがわかりましたが、平均を歪める方法があるという感覚/直感があるため、それはエレガントではありません。

ペアの最初の文字を選択することを考えていました-つまり。行 - (私は最終的に 4 ペア シーケンスを生成しています) システム ランダム関数 (Random class.Next) を使用してから、「加重」ランダム アルゴリズムを使用して 2 番目の文字を選択することができます。

何か案は?

4

6 に答える 6

5

あなたの例のサンプルを考えると、最初にすべての数字の累積シリーズを作成します(1、15、12、0 => 1、16、28、28)。

次に、0 から 27 までの乱数 (19 としましょう) を生成します。

次に、19 は >=16 であるが <28 であると計算すると、バケット 3 (BA) が得られます。

于 2013-01-30T12:18:22.297 に答える
5

特定の問題に対する他の回答には、いくつかの良い提案があります。「一様確率分布に従う乱数のソースを持っていますが、与えられた不一様確率分布に従うようにしたい」という一般的な問題を解決するために、次の関数である分位関数を計算できます。その変換を実行します。ここで分位関数が必要な関数である理由を説明する穏やかな紹介をします。

C# でランダムな不均一データを生成する

于 2013-01-30T15:14:51.070 に答える
1

すべての周波数を合計し、AAからZZまでそれを使用してペアを生成するのはどうですか。

rndが0を返す場合、ペアの合計頻度があるとしましょう。1〜14を返す場合、AAを取得し、次にABなどを取得します。

于 2013-01-30T12:23:16.290 に答える
1

度数行列を使用して、完全な値のセットを生成します。セットを Random.Next() で並べ替えます。ランダム化されたセットを配列に格納します。次に、その配列が Random.Next(randomarray.Length) に基づいている場合は、要素を選択するだけです。

周波数を計算する数学的な方法があれば、それも可能です。ただし、プリコンパイルされキャッシュされたセットを作成すると、これが繰り返し呼び出される場合に計算時間が短縮されます。

注意として、最大頻度によっては、これにはかなりの量のストレージが必要になる場合があります。ループしてセットを構築する前に、 random のインスタンスを作成することもできます。これは、乱数発生器を再シードしないようにするためです。

...

別の方法(質問の最後で提案したものと同様)は、最初に行を選択し、2番目に加重頻度を使用して列を選択する2つのパスでこれを行うことです。それは、範囲に制限された行頻度の合計になります。最初の提案は、重みに基づいてより均等に配分する必要があります。

于 2013-01-30T12:28:44.160 に答える
0

If efficiency is not a problem, you could create a key->value hash instead of an array. An upside of this would be that (if you format it well in the text) it would be very easy to update the values should the need arise. Something like

{
    AA => 5, AB => 2, AC => 4,
    BA => 6, BB => 5, BC => 9,
    CA => 2, CB => 7, CC => 8
}

With this, you could easily retrieve the value for the sequence you want, and quickly find the entry to update. If the table is automatically generated and extremely large, it could help to get/be familiar with vim's use of regular expressions.

于 2014-05-16T14:15:39.383 に答える
0

確率の合計を取ります。ゼロとその合計の間の乱数を取ります。乱数以上になるまで確率を合計します。次に、アイテムを使用します。

例: 擬似コード:

b = getProbabilites()
s = sum(b)
r = randomInt() % s
i = 0
acc = 0
while (acc < r) {
    acc += b[i]
    i++
}

return i
于 2013-01-30T12:36:45.197 に答える