代码是
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() 提交解决方案。
在 C 中的数值食谱:科学计算的艺术(William H. Press、Brian P. Flannery、Saul A. Teukolsky、William T. Vetterling;纽约:剑桥大学出版社,1992 年(第 2 版,第 277 页)) ,提出以下意见:
“如果你想生成一个 1 到 10 之间的随机整数,你应该总是使用高位来实现,如
j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));
从来没有任何类似的东西
j = 1 + (rand() % 10);
(使用低阶位)。”
从man 3 rand
这static_cast<double>
是多余的,因为“+1.0”无论如何都会导致促销加倍。
Boost:Random怎么样
您可以使用 unsigned long long 而不是 double 进行算术运算,但前提是 ULONGLONG_MAX >= UINT_MAX*UINT_MAX,这可能是实现定义的。但是,如果您担心这一点,您会担心在 (max - min) 或 RAND_MAX 很大的情况下原始代码中的潜在精度损失。
long long 实际上是否更快可能取决于您平台的硬件浮动有多好。但整数算术可以说本质上比浮点数更简单。
就像是
min + number % (max - min + 1)
检查最终情况