2016-10-26 18 views
1

与えられた分布で数字/単一文字を生成することに関して2つの質問があります。与えられた分布で文字を生成する

  1. C++でLaplaceディストリビューションを実装するにはどうすればよいですか?私はそれがブーストライブラリで利用可能であることを知っているが、私はそれを使用することはできませんと言ってみましょう。また、私はc + 11の標準ライブラリには表示されません。
  2. 正規分布で文字のテキストを生成する必要がある場合は、生成された倍精度数をintに変換してchar型に変換しますか?

    std::default_random_engine generator; 
    std::normal_distribution<double> distribution(112.0,5.0); 
    int number = (int)distribution(generator); 
    // a-z characters 
    if(number >= 97 && number <= 122) return (char)number; 
    else generate once again; 
    

あなたの助けを期待します。

+0

から構成することができケース相当品)?例えば、それは、例えば、文字が連続して符号化されるASCIIまたは他の符号化。 –

+0

あなたはそれを試しましたか?そのソリューションのあなたの問題は何ですか? – Hayt

+0

Boostのソリューションを使用できない場合。org、なぜStackOverflow.comのソリューションを使用できると思いますか?ライセンスはそれほど違いはありません。 – MSalters

答えて

1

1)ラプラス分布は、パラメータとしてに実装することができる$ \ mathbf {R} $から$ [0,1] $までの関数である明示密度(hereを参照)そのメンバ変数には、たとえば、分布のパラメータが含まれているクラスの関数です。何か:

class LaplaceRandomVariable 
{ 
    double _b; 
    double _mu; 
    public: 
     LaplaceRandomVariable(double b, double mu) 
     { 
      _b = b; 
      _mu = mu; 
     } 
     double Distribution(double x) const 
     { 
      return (0.5/_b) * exp(-abs(x - _mu)/_b); //you'll need error checking for _b could be zero 
     } 

}; 

あなたに画像を与えます。

2)正規分布については、正規乱数変数は$ \ mathbf {R} $の値を持ち、分布も同様です。 doubleintにキャストするのではなく、私はむしろ、与えられた平均と分散を持つ正規確率変数の離散近似をバイナリランダム変数で使用したいと思います。 (例えば、thisを参照してください)大まかに言えば、正規分布を見たい場合、charの数字は無限大になります。それはまさに上記の二項近似が為されたものです。

より正確には、$ B(n、p)$分布を考えてみましょう(私たちが共通の基準を持つためのウィキペディアの表記法)。 nが$ + \ infty $に収束するとき、$ B(n、p)$は正規分布$ N(np、np(1-p))$に近似する傾向があります。あなたは、あなたのcharの正規分布の平均mと分散vを与えられます。したがって、m = npおよびv = np(1-p)。 B(n、p)は{0、...、n}の値を持ち、charのスパン{97、...、122} = {0、...、25} +97これは、p = m/25およびv = m *(1-m/25)を誘発する。 {0、...、25}の値を持つB(m/25、m *(1-m/25))をシミュレートしようとしています。あなたは97を追加し、対応するcharを取得するにはstatic_cast<char>このintになります。

この時点で残っていることは、以前に確立されたnとpの値でB(n、p)をシミュレートすることです。そして、このために、使用すること自由に感じ:

http://www.cplusplus.com/reference/random/binomial_distribution/

+0

あなたの返事をありがとう。 2.次に私は二項分布を使用します。標準ライブラリにも実装されているので、さらに簡単になります。 1. 'std :: default_random_engine generator'でどのように使用できますか?または、私がこの 'distribution(generator);のようなランダムな文字を生成できるように他の関数?また、私は与えられた範囲の文字を生成するためにそれを使用したいと思います。私は唯一の方法はint型にchar型にキャストしていると思いますか? –

+0

あなたのコメントの質問への回答を含めるように私の答えを編集します –

+0

ありがとうございました。しかし、私は第1の質問のためのあなたの答えを意味しました:P私はどのようにLaplaceRandomVariableクラスを使用して与えられたラプラス分布と文字/整数を生成することができます。標準ライブラリが提供する 'distribution(generator);と同様のものを実現したいと思います。出来ますか? –

0

を私はサンプリング手紙のための二項を使用して、すべてのよ(あなたにもポアソンを見てかもしれないが、分散は少しオフになって、私は思う)しながら

Wrtのラプラス分布は、Z'`(またはそれらの低級 `にA'` ''から正規分布を作成しないのはなぜC++ 11の線に沿って標準片

std::default_random_engine generator; 

template <typename gen> double 
sample_laplace(double mu, double b, gen& generator) { 
    std::uniform_real_distribution<double> rng(0.0, 1.0); 

    double x = -std::log(1.0 - rng(generator)) * b; 
    if (rng(generator) < 0.5) 
     x = -x; 

    return x + mu; 
} 
関連する問題