首页 > 解决方案 > 随机数生成功能说明

问题描述

谁能解释这两条功能线?

 int getRandomNumber(int min, int max)
 {
    static const double fraction = 1.0 / (RAND_MAX + 1.0);
    return min + static_cast<int>((max - min + 1) * (rand() * fraction));
 }

标签: c++randomcastingstaticconstants

解决方案


看起来它将rand()函数的输出限制在最小值和最大值之内。

一个 double 类型的值fraction是从1.0 / (RAND_MAX + 1.0);

RAND_MAX 是在 cstdlib 或其他头文件或库中定义的预编译器值,它是一个大正整数,表示您的程序可以使用的最大有符号 int。较高的 RAND_MAX 会fraction降低,因为 1/number 是倒数;4 的倒数是 1/4 或 0.25。5 是 1/5 或 0.20

1.0 是将 RAND_MAX 隐式转换为浮点数,即十进制;这确保 / 除法 / 运算符不进行整数除法(5 / 2 == 2; vs 5.0 / 2.0 == 2.5)

return min + static_cast<int>((max - min + 1) * (rand() * fraction));

返回由随机因子减少的最小/最大传播的整数表示,添加到原始最小值。此行使用最小参数值作为“地板”。static_cast<int>()将 的浮点值向下舍((max - min + 1) * (rand() * fraction))入为整数,也就是没有小数部分的整数。这种强制转换对于返回一个 int 很重要,但它也可以通过向下舍入来确保不超过最大值。

(max - min + 1)是最大和最小参数 + 1 之间的差值。因此,如果 max == min 您将 (rand() * fraction) 乘以 1 而不是零。

rand()生成一个介于 0 和 RAND_MAX 之间的半随机整数(无小数部分)因为fraction它是 RAND_MAX + 1 的倒数,所以小数部分将始终小于 1,并且 rand() 的输出将是最小/最大扩展的随机部分。除了混合 C 和 C++ 代码混淆之外,理解这个函数的关键部分是知道 RAND_MAX 被分数变量和 rand() 函数使用。将(rand() * fraction)零件视为距离的一部分min

我会尝试为这个函数提供多个值,每次调整最小值、最大值和小数值,看看输出如何变化,你可能会找到一个模式。通过使分数小于 (1.0 / RAND_MAX + 1.0),您可以将返回值聚类到更接近最小值。(查找数学天花板和地板,以及核桃关于均匀分布的评论)。这可以用来平滑输出,或者使某些东西更可预测,或者围绕输入值聚集返回值。如果数学对您来说是令人困惑的部分,那么弄乱代码并查看会发生什么可能会帮助您理解和直觉数学函数。

欢迎来到堆栈溢出!


推荐阅读