0

代码是

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() 提交解决方案。

4

5 回答 5

3

@安德鲁·斯坦

在 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

于 2008-09-26T17:36:15.823 回答
3

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

于 2008-09-26T17:39:20.527 回答
1

Boost:Random怎么样

于 2008-09-26T17:29:01.207 回答
0

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

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

于 2008-09-26T19:11:20.040 回答
-1

就像是

min + number % (max - min + 1)

检查最终情况

于 2008-09-26T17:32:02.963 回答