Rand_Max *(max-min)+ min<<那是什么?

时间:2012-05-11 03:33:26

标签: c++ stl random c++11 srand

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

问题: RAND_MAX *(最大 - 最小)+分钟);

好的,所以我知道这个东西中的算法,lambda表达式和capture子句。我的问题对所有这些都非常荒谬。上面的粗体文字是什么意思。我的意思是,我知道它是随机值生成过程的一部分。但不知道到底发生了什么。所以有人可以打破那些微小的小代码。

5 个答案:

答案 0 :(得分: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. 之间的随机整数
  3. (double) / RAND_MAX:将RAND_MAX除以double,得到0到1之间均匀分布的双精度:
  4. * (max-min):乘以范围(max-min),产生从0到(最大 - 分钟)的双倍
  5. +min:添加最小值以产生最小值和最大值之间的随机双倍
  6. static_cast<T>:将其强制转换为原始类型
  7. 结果是在minmax之间均匀分布的T型随机数。

答案 1 :(得分:2)

这是一个随机函数限制在下行的最小值(因为兰德曲线可以返回零)并且限制为最大值,因为即使它返回100%的最大值,并且加到最小值,你将达到最大值< / p>

答案 2 :(得分:2)

表达式static_cast<double>rand()/RAND_MAX创建一个介于0.0和1.0之间的数字 当您将其乘以(max-min)时,您可以更改范围,当您添加到min时,您可以移动范围。因此,在该表达式之后,您有一个随机数(double),范围从minmax

答案 3 :(得分:2)

您需要查看整个表达式:static_cast<double>(rand()) /RAND_MAX*(max-min)+min)。具有明确分组的内容如下:(static_cast<double>(rand()) /RAND_MAX)*(max-min)+min) 第一组返回0和0之间的随机值。 1,因为rand()返回0到RAND_MAX范围内的值。第二组将0到1范围转换为minmax范围。

答案 4 :(得分: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&lt; = a&lt; = max,

B+min = max
B = max-min

另一方面

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

是最小值和最大值之间的随机数。