出現させたいパーセンテージに重み付けして、アルファベットから文字をランダムに選択する簡単な方法が必要です。たとえば、ランダム関数で文字「E」が 5.9% の確率で出現するようにしたいが、「Z」は 0.3% の確率で出現するようにしたい (それぞれの平均出現率に基づいて、など)。アルファベットで)。助言がありますか?私が見る唯一の方法は、配列に 10000 文字 (590 個の「E」、3 個の「Z」など) を入力し、その配列からランダムに文字を選択することですが、メモリを大量に消費し、扱いにくいようです。
4 に答える
5
これが機能するかどうかはわかりませんが、うまくいくようです:
- 文字と頻度のリストを取得し、最小頻度から最大頻度に並べ替えます。
- 各要素 n に以前のすべての重みの合計と度数のリストの要素 n が含まれる 26 要素の配列を作成します。配列の最後の要素の合計を書き留めます
- 0 と上記で書き留めた合計の間の乱数を生成します
- その数が収まる要素に到達するまで、合計の配列のバイナリ検索を実行します
ちょっとわかりにくいので、以下のようになります。
- これらの頻度の 5 文字のアルファベットがある場合、a = 5%、b = 20%、c = 10%、d = 40%、e = 25%、頻度で並べ替えます: a、c、b、e、d
- 要素の実行中の合計を保持します: 5、15、35、60、100
- 0 から 100 の間の乱数を生成します。22 だったとします。
- 22 になる要素を二分探索します。この場合、それは要素 2 と 3 の間にあり、文字 "b" になります (ここでは切り上げが必要だと思います)。
于 2012-06-05T21:59:48.407 に答える
2
容量と速度のトレードオフについては既に認識しているので、ここでは触れません。
アプリオリに各文字の頻度を計算できる場合は、配列を事前に生成して (または動的に作成して一度配列を埋めて)、目的の精度レベルでスケールアップすることができます。
小数点以下 1 桁の精度でパーセンテージを使用したため、1000 エントリの配列を検討してください。各インデックスは、頻度の 1% の 10 分の 1 を表します。したがって、 に等しい、に等しいなど、letter[0]
に等しいまで続く必要があります。(英語の文字の相対頻度による値)letter[82]
'a'
letter[83]
letter[97]
'b'
letter[999]
'z'
ここで、0 から 1 の間の乱数を生成し (一様分布を想定して、好みの PRNG を使用)、その結果に 1000 を掛けます。これにより、配列のインデックスと加重ランダム文字が得られます。
于 2012-06-05T22:43:18.183 に答える