【问题标题】:Rand_Max*(max-min)+min << what is that?Rand_Max*(max-min)+min << 那是什么?
【发布时间】:2012-05-11 03:33:25
【问题描述】:
generate(vec.begin(), vec.end(), [=](){return static_cast<T>(static_cast<double>(ran())
/RAND_MAX*(max-min)+min); });

问题: RAND_MAX*(max-min)+min);

好的,所以我知道这件事中的算法、lambda 表达式和捕获子句。我的问题对所有这些都很荒谬。上面加粗的文字是什么意思。我的意思是,我知道它是随机值生成过程的一部分。但不知道到底是怎么回事。那么有人可以分解那个微小的小代码。

【问题讨论】:

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


    【解决方案1】:

    static_cast&lt;double&gt;(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,在 0 和 1 之间产生均匀分布的双精度:
    3. * (max-min):乘以 (max-min) 范围,得到一个从 0 到 (max-min) 的双精度数
    4. +min:添加最小值以在最小值和最大值之间产生随机双精度值
    5. static_cast&lt;T&gt;:将其转换回原始类型

    结果是在minmax 之间均匀分布的T 类型随机数。

    【讨论】:

    • 而 uniform_*_distribution(min,max) 可能是更好的方法。
    • +1 我不想唠叨,因为他只是问它有什么作用,但使用 STL 肯定更有意义。
    【解决方案2】:

    这是一个随机函数,其缺点是受限于 min(因为 rand 块可能返回零)并限制为 max,因为即使它返回 100% 的 max-min,并添加到 min,你也会处于 max

    【讨论】:

      【解决方案3】:

      表达式 static_cast&lt;double&gt;rand()/RAND_MAX 创建一个介于 0.0 和 1.0 之间的数字
      当你乘以(max-min) 时,你改变了范围,当你添加到min 时,你改变了范围。因此,在该表达式之后,您有一个随机数(双精度),范围从 minmax

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          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

          B+min = max
          B = max-min
          

          其他人

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

          是一个介于最小值和最大值之间的随机数。

          【讨论】:

          • rand()/RAND_MAX 为零,除非rand() == RAND_MAX
          • rand() 返回整数还是浮点数?我认为这是一个浮动。因此,如果 rand() 返回正值,则 rand()/RAND_MAX 不能为零。
          • rand() 返回一个整数:en.cppreference.com/w/cpp/numeric/random/rand
          • 嗯...现在我明白了 static_cast
          猜你喜欢
          • 2012-08-26
          • 2023-03-19
          • 2011-11-20
          • 2016-06-07
          • 2022-06-12
          • 1970-01-01
          • 2013-02-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多