C++ Rand_Max*(Max-min)和#x2B;最小值<&书信电报;那是什么? generate(vec.begin(),vec.end(),[=](){返回static_cast(static_cast(ran()) /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创建一

问题:RAND_MAX*(MAX-min)+min)


好的,我知道算法,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