如何简化此代码(根据无符号int在min和max之间生成一个随机int)?

时间:2020-03-06 14:47:45  来源:igfitidea点击:

该代码是

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

解决方案

Boost:Random怎么样

就像是

min + number % (max - min + 1)

检查最终案例

@安德鲁·斯坦

C中的数字食谱:科学计算的艺术(William H. Press,Brian P. Flannery,Saul A. Teukolsky,William T. Vetterling;纽约:剑桥大学出版社,1992年(第二版,第277页)) ,提出以下意见:

"If you want to generate a random
  integer between 1 and 10, you should
  always do it by using high-order bits,
  as in 
  
  j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0))); 
  
  and never by
  anything resembling 
  
  j = 1 + (rand() % 10); 
  
  (which uses lower-order bits)."

man 3 rand

" static_cast <double>"是多余的,因为" +1.0"将导致提升双倍。

我们可以以无符号的long long而不是double的形式进行算术运算,但前提是ULONGLONG_MAX> = UINT_MAX * UINT_MAX,这很可能是实现定义的。但是,如果我们对此感到担心,则在(max min)或者RAND_MAX较大的情况下,我们将担心原始代码中的精度可能会损失。

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