不均一なランダム数を生成する方法を教えてください。
私はJavaを使用していますが、コード例は任意のものにすることができます。
1つの方法は、2つの均一な乱数を足し合わせて(つまり、2つのサイコロを振って)偏った分布を作成することです。
不均一なランダム数を生成する方法を教えてください。
私はJavaを使用していますが、コード例は任意のものにすることができます。
1つの方法は、2つの均一な乱数を足し合わせて(つまり、2つのサイコロを振って)偏った分布を作成することです。
一様分布の乱数を生成してから、それぞれに逆不均一累積分布関数を適用してみてください。
どのような偏差の分布が必要ですか?
これは常に機能する手法ですが、常に最も効率的であるとは限りません。累積分散関数P(x)は、値がxを下回る時間の割合を示します。したがって、xの可能な最小値でP(x)= 0、xの可能な最大値でP(x)=1です。すべての分布には一意のCDFがあり、P(x)が0から1に上昇するように分布のすべてのプロパティをエンコードします。yが間隔[0,1]で均一に逸脱している場合、xはP(x )= yは、分布に応じて分布されます。これを完全に機能させるには、分布のP(x)の逆数を計算する方法が必要です。
Meta.Numericsライブラリは、一般的に使用される多数の分布(たとえば、正規、対数正規、指数、カイ2乗など)を定義し、それぞれのCDF(Distribution.LeftProbability)および逆CDF(Distribution.InverseLeftProbability)を計算する関数を備えています。。
特定の分散に対して高速な特殊な手法、たとえば、正規分布の偏差に対するボックスミュラー手法については、「数値レシピ」という本を参照してください。
Javaを使用している場合は、私のUncommonsMathsライブラリが興味深いかもしれません。これには、一様分布、ガウス分布、ポアソン分布、二項分布、および指数分布の乱数を生成するためのクラスが含まれています。 この記事では、これらのディストリビューションをどのように使用するかを示します。