3

指数分布の変量が必要ですが、これを行うのはかなり効率的です。

double exp_variate(double lambda){
    return -log(my_random_function())/lambda;
}

ここで、my_random_functionはdouble xを与えるので、 (厳密に)または0 < x < 1を取得しないことを意味します。0と1の値を除外した乱数を取得するにはどうすればよいですか。誰かが以前にこれを尋ねたことがあると確信していますが、私はそれを見ることができません。また、指数分布の値を生成する他の方法も利用できます。-log(0)0

編集:>から<

4

1 に答える 1

4

0 < x < 1数値が同時に 0 未満で 1 を超えることはできないため、おそらく を意味していたと思われます。

その場合、私はおそらく次のようなことをします:

double my_random_function() { 
    return (rand() + 1.0) / (RAND_MAX+2.0);
}

C の乱数ジェネレーターは通常、0 から RAND_MAX までの数値を生成します。これは、乱数ジェネレーターによって生成された値に 1 を追加するため、0 を生成することはできません。RAND_MAX+1 で除算すると、1/RAND_MAX から (RAND_MAX+1)/(RAND_MAX+1) の結果が得られるため、後者はこれを回避したいので (RAND_MAX+2) を使用すると、(RAND_MAX+1)/(RAND_MAX+2) から 1.0/(RAND_MAX+2) が得られます。 1.0 よりわずかに小さい値です。

于 2012-08-02T01:31:51.477 に答える