generate(vec.begin(), vec.end(), [=](){return static_cast<T>(static_cast<double>(ran())
/RAND_MAX*(max-min)+min); });
问题: RAND_MAX *(最大 - 最小)+分钟);
好的,所以我知道这个东西中的算法,lambda表达式和capture子句。我的问题对所有这些都非常荒谬。上面的粗体文字是什么意思。我的意思是,我知道它是随机值生成过程的一部分。但不知道到底发生了什么。所以有人可以打破那些微小的小代码。
答案 0 :(得分:8)
static_cast<double>(ran())/RAND_MAX*(max-min)+min);
我假设您错误输入rand()
,它返回从0到RAND_MAX的伪随机整数。让我们以一种澄清优先级的方式重写它:
(T) ( (((double) rand() / RAND_MAX) * (max-min) ) + min
它的作用是:
rand()
:取0到RAND_MAX (double) / RAND_MAX
:将RAND_MAX除以double,得到0到1之间均匀分布的双精度:* (max-min)
:乘以范围(max-min)
,产生从0到(最大 - 分钟)的双倍+min
:添加最小值以产生最小值和最大值之间的随机双倍static_cast<T>
:将其强制转换为原始类型结果是在min
和max
之间均匀分布的T型随机数。
答案 1 :(得分:2)
这是一个随机函数限制在下行的最小值(因为兰德曲线可以返回零)并且限制为最大值,因为即使它返回100%的最大值,并且加到最小值,你将达到最大值< / p>
答案 2 :(得分:2)
表达式static_cast<double>rand()/RAND_MAX
创建一个介于0.0和1.0之间的数字
当您将其乘以(max-min)
时,您可以更改范围,当您添加到min
时,您可以移动范围。因此,在该表达式之后,您有一个随机数(double),范围从min
到max
。
答案 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范围转换为min
到max
范围。
答案 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
是最小值和最大值之间的随机数。