2
generate(vec.begin(), vec.end(), [=](){return static_cast<T>(static_cast<double>(ran())
/RAND_MAX*(max-min)+min); });

問題: RAND_MAX*(最大-最小)+最小);

わかりましたので、アルゴリズム、ラムダ式、およびこのことのキャプチャ句を知っています。私の質問は、そのすべてにとって非常にばかげています。上記の太字のテキストは何を意味していますか。つまり、ランダム値生成プロセスの一部を知っています。しかし、一体何が起こっているのか正確にはわかりません。誰かがそのちっぽけな小さなコードを分解できますか。

4

5 に答える 5

8

static_cast<double>(ran())/RAND_MAX*(max-min)+min);

rand()0 から RAND_MAX までの疑似乱数整数を返す のタイプミスを想定しています。優先順位を少し明確にする方法でそれを書き直しましょう。

(T) ( (((double) rand() / RAND_MAX) * (max-min) ) + min

したがって、それは次のとおりです。

  1. rand(): 0 から RAND_MAX までのランダムな整数を取得します
  2. (double) / RAND_MAX: RAND_MAX で double として除算し、0 と 1 の間で均一に分散された double を生成します。
  3. * (max-min): range を掛けて、(max-min)0 から (max-min) までの double を生成します。
  4. +min: 最小値を追加して、最小値と最大値の間のランダムな double を生成します
  5. static_cast<T>: 元の型にキャストし直します

min結果は、 と の間にある T 型の一様分布乱数maxです。

于 2012-05-11T03:48:58.793 に答える
2

これは、マイナス側が最小で制限されたランダム関数であり (ランドピースがゼロを返す可能性があるため)、最大最小の 100% を返し、最小に追加されたとしても最大になるため、最大に制限されます。

于 2012-05-11T03:38:27.690 に答える
2

static_cast<double>rand()/RAND_MAXは 0.0 と 1.0 の間の数値を作成し
ます。これを で乗算すると(max-min)範囲が変更され、加算するとmin範囲がシフトします。minしたがって、その式の後に からまでの範囲の乱数 (倍精度) がありますmax

于 2012-05-11T03:41:25.207 に答える
2

式全体を見る必要があります: static_cast<double>(rand()) /RAND_MAX*(max-min)+min). 明示的なグループ化では次のようになります(static_cast<double>(rand()) /RAND_MAX)*(max-min)+min)。最初のグループは、 0 から RAND_MAX の範囲の値を返すため、
0 と 1 の間のランダムな値を返します。rand()2 番目のグループは、0 ~ 1 の範囲を ~ の範囲に変換minmaxます。

于 2012-05-11T03:43:55.270 に答える
0

ran() 関数は、min と max の間のランダムな値を返しますか?

ただし、A と B (最小値と最大値) の間のランダムな値が必要になる場合があります。そのため、結果を調整できます。

a is double, so we use a static_cast! 
a = rand()      ; 0     <=   a   <= RAND_MAX
a = a/RAND_MAX  ; 0     <=   a   <= 1
a = B * a       ; 0     <=   a   <= B
a = min +a      ; 0+min <=   a   <= B+min

min <= a <= max を生成するには、

B+min = max
B = max-min

他の手で

a = rand()/RAND_MAX*(max-min) + min

min と max の間の乱数です。

于 2012-05-11T03:55:24.640 に答える