如何简化此代码(根据无符号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是否实际上更快,可能取决于平台的硬件浮动情况。但是可以说整数运算本质上比浮点运算简单。