如何简化此代码(基于无符号整数生成最小和最大之间的随机整数)?

StackOverflow https://stackoverflow.com/questions/140786

  •  02-07-2019
  •  | 
  •  

代码是

return min + static_cast<int>(static_cast<double>(max - min + 1.0) *
  (number / (UINT_MAX + 1.0)));

number是通过rand_s得到的随机数。min 和 max 是整数,表示最小值和最大值(含)。

如果您提供的解决方案不使用 unsigned int 作为数字,还请解释如何使其随机。

请不要使用 rand() 提交解决方案。

有帮助吗?

解决方案

static_cast<double> 是多余的,因为“+1.0”无论如何都会导致升级加倍。

其他提示

@安德鲁斯坦

在 C 语言的数值配方中:科学计算的艺术(William H.出版社,布莱恩·P.弗兰纳里,索尔 A.特乌科尔斯基,威廉·T.维特林;纽约:剑桥大学出版社,1992 年(第 2 版,第 16 页)277)),提出以下意见:

“如果您想在1到10之间生成一个随机整数,则应始终使用高阶位来做到这一点

j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));

从来没有类似的东西

j = 1 + (rand() % 10);

(使用低阶位)。”

man 3 rand

怎么样 提升:随机

您可以使用 unsigned long long 而不是 double 进行算术运算,但前提是 ULONGLONG_MAX >= UINT_MAX*UINT_MAX,这可能是实现定义的。但如果您担心这一点,您会担心在 (max - min) 或 RAND_MAX 很大的情况下原始代码中可能会出现精度损失。

long long 是否实际上更快可能取决于您的平台的硬件浮动有多好。但可以说整数运算本质上比浮点运算更简单。

就像是

min + number % (max - min + 1)

检查最终情况

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top