C++ Rand_Max*(Max-min)和#x2B;最小值<&书信电报;那是什么? generate(vec.begin(),vec.end(),[=](){返回static_cast(static_cast(ran()) /RAND_MAX*(MAX-min)+min);});
问题:RAND_MAX*(MAX-min)+min)C++ Rand_Max*(Max-min)和#x2B;最小值<&书信电报;那是什么? generate(vec.begin(),vec.end(),[=](){返回static_cast(static_cast(ran()) /RAND_MAX*(MAX-min)+min);});,c++,stl,random,c++11,srand,C++,Stl,Random,C++11,Srand,问题:RAND_MAX*(MAX-min)+min) 好的,我知道算法,lambda表达式,还有,capture子句。我的问题对所有这些来说都很可笑。上面黑体字的意思是什么。我的意思是,我知道它是随机值生成过程的一部分。但我不知道到底发生了什么。因此,有人可以分解这个微小的代码。这是一个随机函数,在下边限制为min(因为rand片段可能返回零),限制为max,因为即使它返回100%的max-min,并添加到min,您也将处于max表达式static\u castand()/RAND_MAX创建一
好的,我知道算法,lambda表达式,还有,capture子句。我的问题对所有这些来说都很可笑。上面黑体字的意思是什么。我的意思是,我知道它是随机值生成过程的一部分。但我不知道到底发生了什么。因此,有人可以分解这个微小的代码。这是一个随机函数,在下边限制为min(因为rand片段可能返回零),限制为max,因为即使它返回100%的max-min,并添加到min,您也将处于max表达式
static\u castand()/RAND_MAX
创建一个介于0.0和1.0之间的数字当您将其乘以
(max-min)
时,您会更改范围,当您添加到min
时,您会移动范围。因此,在该表达式之后有一个随机数(double),范围从min
到max
,您需要查看整个表达式:static\u cast(rand())
/RAND_MAX*(MAX-min)+min)
。具有显式分组的如下所示:(static_cast(rand())
/RAND_MAX)*(MAX-min)+min)
第一组返回一个介于0和1之间的随机值,因为
rand()
返回一个范围为0到rand_MAX的值。第二组将0到1的范围转换为min
到MAX
范围。静态_cast(ran())/rand_MAX*(MAX-min)+min代码>
我假设您输入了错误的rand()
,它返回一个从0到rand_MAX的伪随机整数。让我们用一种稍微澄清优先级的方式重写它:
(T)(((双)兰德()/rand_MAX)*(MAX-min))+min
因此,它所做的是:
rand()
:取一个介于0和rand\u MAX之间的随机整数
(double)/RAND_MAX
:将double除以RAND_MAX,得到0到1之间均匀分布的double:
*(最大-最小)
:乘以范围(最大-最小)
,得到从0到(最大-最小)的双精度
+min
:添加最小值以产生最小值和最大值之间的随机双精度
static\u cast
:将其转换回原始类型
结果是T型均匀分布的随机数介于min
和max
之间函数返回一个介于min和max之间的随机值
但有时我们需要一个介于a和B之间的随机值(最小值和最大值),所以我们可以调整结果
generate(vec.begin(), vec.end(), [=](){return static_cast<T>(static_cast<double>(ran())
/RAND_MAX*(max-min)+min); });
在另一方面
B+min = max
B = max-min
是一个介于最小值和最大值之间的随机数。而均匀分布(最小值,最大值)可能是一个更好的方法。+1我不想唠叨,因为他只是问它做什么,但使用STL肯定更有意义。rand()/rand\u max
为零,除非rand()==rand\u max
.rand()返回一个整数还是一个浮点数?我认为它是一个浮点数。因此,如果rand()返回一个正数,rand()/rand\u MAX不能为零。rand()
返回一个整数:哼哼……现在我理解了静态\u转换
B+min = max
B = max-min
a = rand()/RAND_MAX*(max-min) + min