0

基本的な定型コードを使用して乱数を生成するために、Boost 1.52 で uniform_int_distribution を使用しています。

#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int_distribution.hpp>

boost::random::mt19937 gen;

int roll_die()
{
    boost::random::uniform_int_distribution<> dist(1, 6);
    return dist(gen);
}

int main()
{
    for (int i = 0; i < 10; i++) std::cout << roll_die() << std::endl;     
}

これの一部をはるかに大きなプロジェクトに実装しましたが、うまく機能します。これが私の質問です。

上記の関数では、dist オブジェクトが関数に対してローカルであるように見えます。roll_die() を何度も呼び出すと、 dist() を関数に対してローカルにすると、多くのオーバーヘッドが発生するようです。

このオブジェクトの最小パラメータと最大パラメータを一度設定してから、より大きなオブジェクトなどに dist のインスタンスを 1 つだけ持つ方がよいと考えています。どうやってこれを行うのですか?クラステンプレートの「パブリックメンバー関数」部分を理解しようとしました: http://www.boost.org/doc/libs/1_47_0/doc/html/boost/random/uniform_int_distribution.html#id744736-bbしかし、それは頭を超えて。そのドキュメントでは、次のように表示されます。

void param(const param_type & param); //Sets the parameters of the distribution.

これを実際にどのように使用しますか?.param() 自体は呼び出す関数ですか、それとも別の関数の代役ですか? 私が求めていることを行った別のブーストの例が見つかりませんでした。ご支援とアドバイスをよろしくお願いします。

4

1 に答える 1

5

...のように思えますが、多くのオーバーヘッドが発生します。

と思うかもしれませんが、実際にこれを知っていますか?実際にプロファイラーを実行したり、別の方法でコードをベンチマークしたりせずに、何かが速いか遅いかを推測してはなりません。ソースを見ると、uniform_int_distributionのコンストラクターが最小値と最大値を割り当てるだけであることがわかります。これは、実際には取るに足らないオーバーヘッドです。特に、実際の乱数生成が 2 つの割り当てよりもはるかに複雑な操作になることを考慮すると。したがって、コードをそのままにしておくことをお勧めします。プログラムが遅すぎる場合は、いつでもプロファイリングしてから最適化できます。

編集: Djikstra を引用するには:「時期尚早の最適化はすべての悪の根源です」。あまりにも頻繁に、プログラマーは必要以上に複雑なコードを書いてしまいます。やらないでください - 速度の問題がある場合にのみ最適化を開始してください。

とにかく、あなたの質問に答えるために:param()は のメンバーですuniform_int_distribution。タイプのオブジェクトを取りますuniform_int_distribution::param_type。次のように使用できます。

using namespace boost::random;

// Create an uniform_int_distribution object
uniform_int_distribution<> dist(1, 6);

// Create a params object
uniform_int_distribution::param_type newParams(10, 500);

// The following will reconfigure dist to have 10 and 500 as 
// min and max value
dist.param(newParams);

このようにして、1 つの配布オブジェクトを何度でも再構成できます。ただし、「オーバーヘッド」は、新しい配布オブジェクトを構築する場合と同じになる可能性があります。

オブジェクトが一度だけ作成されるようにする別の方法:

int roll_die()
{
    static boost::random::uniform_int_distribution<> dist(1, 6);
    return dist(gen);
}

関数内の変数を静的として宣言すると、変数がグローバルであるかのように同様の効果がありますが、関数のスコープ内でのみ表示されます。

于 2013-01-10T22:16:43.853 に答える