2

C++ 標準ライブラリ - 乱数の生成と分布: 指数分布のパラメーターを設定するにはどうすればよいですか?

指数分布の乱数を必要とするプログラムがあります。C++11 乱数および分布ライブラリ サポートを使用しています。

私はディストリビューションを持っています:std::exponential_distribution<double> exp_dis(lambda);

lambda最初は任意の値です。0.0または1.0使用しても問題ない値です。

ポインターを使用してスレッド関数でこの分布を参照します。(データの競合状態を避けるために、スレッド関数ごとに独立したディストリビューションを用意しています。)

の値はlambdaループ内で計算され、ループが実行されるたびに変更される可能性があります。

lamdaしたがって、指数分布内でパラメーターの値を「設定」する方法を知りたいです。

いくつかの簡単な検索から、メンバー関数を使用してこれを行うことができるはずだと思いますが、param()使用する正確な構文を理解できません。

これは機能しません:

// Pointer to exponential distribution object
exp_dis_p->param(lambda);
4

2 に答える 2

2

lambda次のように指数分布を変更することもできます。

template<typename T>
void set_new_lambda(std::exponential_distribution<T> *exp_dis, T val)
{
    typename std::exponential_distribution<T>::param_type new_lambda(val);
    exp_dis->param(new_lambda);
}

そして、次のように使用できます

int main()
{
  std::exponential_distribution<double> exp_dis(0.1);
  std::cout<<exp_dis.lambda()<<'\n';

  set_new_lambda(&exp_dis,0.2);

  std::cout<<exp_dis.lambda()<<'\n';

  return 0;
}

または、 double 型のみを扱っている場合は、次のようにすることもできます。

int main()
{
  std::exponential_distribution<double> exp_dis(0.1);
  auto ptr = &exp_dis;
  std::exponential_distribution<double>::param_type new_lambda(0.2);
  ptr->param(new_lambda);
}

また、param_typefor distribution は として宣言できることがわかりますstd::exponential_distribution<double>::param_type

于 2015-10-27T04:29:12.940 に答える
0

With the following you should be able to set the new lambda:

decltype(exp_dis_p->param()) new_lambda (lambda);
exp_dis_p->param(new_lambda);

This is code I've been using since some time. Like explained by Praetorian in the comments, the param() type has the same arguments as the parent type.

I found this about it in a document about the C++ standardizing:

For each of the constructors of D taking arguments corresponding to parameters of the distribution, P shall have a corresponding constructor subject to the same requirements and taking arguments identical in number, type, and default values. Moreover, for each of the member functions of D that return values corresponding to parameters of the distribution, P shall have a corresponding member function with the identical name, type, and semantics.

With D being the distribution class, and P is the type named by D’s associated param_type.

The decltype function simply:

Inspects the declared type of an entity or queries the type and value category of an expression.

于 2015-10-26T16:03:14.650 に答える