c++ - 随机数生成功能说明
问题描述
谁能解释这两条功能线?
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));
}
解决方案
看起来它将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),您可以将返回值聚类到更接近最小值。(查找数学天花板和地板,以及核桃关于均匀分布的评论)。这可以用来平滑输出,或者使某些东西更可预测,或者围绕输入值聚集返回值。如果数学对您来说是令人困惑的部分,那么弄乱代码并查看会发生什么可能会帮助您理解和直觉数学函数。
欢迎来到堆栈溢出!
推荐阅读
- javascript - Gatsby 代码框:TypeError:无法读取未定义的属性“src”
- tensorflow2.0 - AttributeError:模块“张量流”没有属性“版本”
- sql-server - 将 SQL 结果写入 xlsx 的 Powershell 脚本 - 即使查询返回记录,Excel 工作表也是空白的
- docker - Docker - 守护进程上下文未指向本地目录
- javascript - “无服务器离线:找不到路由。” 在离线模式下运行 AWS Lambda 函数
- django - Webpack 使用文件夹名称而不是 Url 作为公共路径
- javascript - 不显示长度已过期值的记录
- android - React Native 0.60 - 无法使用 react-native run-android 运行应用程序:java.lang.NoClassDefFoundError
- material-ui - Material-UI Menu,MenuItem in a Table 不访问其记录的值,而是 MenuItem 只能访问最后一条记录的值
- javascript - 是否可以重定向不存在的页面?