3

整数範囲R=[a、b](a>=0およびb<=100)、Rのバイアス整数n、および偏差bが与えられた場合、乱数ジェネレーターをnに向けて歪めるためにどの式を使用できますか?

したがって、たとえば、1から10までの数字があり、バイアスの数字を指定しない場合、理論的には、それらの1つをランダムに描画する可能性は同じです。

しかし、私が特定のバイアス数(たとえば、3)を与える場合、数ジェネレーターは他の数よりも頻繁に3を描画する必要があります。

また、バイアス数に加えてたとえば2の偏差を指定すると、数ジェネレータは1から5まで、6から10よりも頻繁に描画する必要があります。

これを実現するためにどのアルゴリズムを使用できますか?

簡単/難しい場合はRubyを使用しています。

4

3 に答える 3

3

最も簡単な方法は、必要なプロパティを使用して正規(別名ガウス)分布からサンプリングし、結果を変換することだと思います。

  • 与えられた平均とsdで通常の値を生成します
  • 最も近い整数に丸める
  • 指定された範囲外の場合(通常は-無限大から-無限大までの全範囲にわたって値を生成できます)、破棄して繰り返します

ユニフォームから法線を生成する必要がある場合、最も単純な変換は「ボックスミュラー」です。

あなたが心配する必要があるかもしれないいくつかの詳細があります。特に、ボックスミュラーは範囲が制限されています(これまでに非常にありそうもない値を生成することはありません)。したがって、非常に狭い範囲を指定すると、値の全範囲を取得することはできません。他の変換はそれほど制限されていません-ルビーが提供するものを使用することをお勧めします(「通常」または「ガウス」を探してください)。

また、値の丸めに注意してください。たとえば、2.6から3.4はすべて3になるはずです。単に小数を破棄すると(つまり、3.0から3.999は3になります)、バイアスがかかります。

効率に本当に関心があり、値を破棄したくない場合は、単に何かを発明することができます。チートする1​​つの方法は、均一な変量をバイアス値と混合することです(したがって、9/10倍は均一を生成し、1/10倍は3を返します)。場合によっては、サンプルの平均のみを気にする場合は、それで十分です。

于 2012-05-07T16:40:38.723 に答える
0

最初の部分では、「しかし、特定のバイアス数(たとえば、3)を与える場合、数ジェネレーターは他の数よりも3を頻繁に描画する必要があります。」、非常に簡単な解決策:

def randBias(a,b,biasedNum=None, bias=0):
   x = random.randint(a, b+bias)
   if x<= b:
       return x
   else:
       return biasedNum

第二部については、それはタスクに依存すると思います。同じ分布から10億個の乱数を生成する必要がある場合は、その数の確率を明示的に計算し、加重乱数ジェネレーターを使用します(ランダム加重選択を参照) 。

于 2012-05-07T17:17:27.080 に答える
0

ユニモーダル分布が必要な場合 (たとえば、3 と述べたように、バイアスが数値範囲の特定の値に集中している場合)、andrew cooke が提供する答えは適切です。偏差を非常に正確に微調整します。

ただし、いくつかのバイアスを作成したい場合---たとえば、a、(a+b)/2、および b の数が他よりも頻繁にある三峰分布が必要な場合は、加重ランダム選択を実装することをお勧めします。

このための簡単なアルゴリズムはStackOverflow に関する最近の質問で与えられました。その複雑さは線形です。このようなアルゴリズムを使用すると、最初に {a, a+1, a+2,..., b-1, b} (サイズ b-a+1) を含むリストを維持するだけで済みます。 X へのバイアスを追加するには、X のいくつかのコピーをリストに追加します (どの程度バイアスをかけたいかによって異なります)。次に、リストからランダムに項目を選択します。

より効率的な方法が必要な場合、最も効率的な方法は「Alias メソッド」と呼ばれ、Denis Bzowy によって Python で非常に明確に実装されました。配列が前処理されると、一定の時間で実行されます (ただし、前処理を行うと、バイアスを更新することはできなくなります。または、テーブルを再処理する必要があります)。

両方の手法の欠点は、ガウス分布とは異なり、X にバイアスをかけても、X-1 と X+1 にいくらかバイアスがかからないことです。この効果をシミュレートするには、次のようなことをする必要があります

def addBias(x, L):
   L = concatList(L, [x, x, x, x, x])
   L = concatList(L, [x+2])
   L = concatList(L, [x+1, x+1]) 
   L = concatList(L, [x-1,x-1,x-1])
   L = concatList(L, [x-2])
于 2012-05-08T21:14:40.730 に答える