有更好的算法可以做到以下几点吗?
我正在尝试生成50个可被7整除的随机数。然后我随机选择其中一个50。返回那个号码。
是否有更有效/更好的方式来随机生成可被7整除的数字?有没有更好的方法来编码/执行此操作?
unsigned int generateRandomNumberDivisibleByN( unsigned int n, unsigned int num=10 )
{
// Post: Generate many different random numbers that are divisible by n, then randomly select one of
// of those numbers to return.
unsigned int potentialNums[num];
for (int i=0, j=2; i<num; i++, j=rand()%INT_MAX)
{
potentialNums[i] = j*n;
}
return potentialNums[ rand()%num ]; // should this be rand()%(num-1) so it never returns an invalid array index?
}
答案 0 :(得分:13)
为什么你不能这样做?
return (rand() % MAX) * 7;
它几乎完全相同。
MAX
小到足以避免在乘法7期间溢出。您可以将其定义为:
const MAX = INT_MAX / 7;
或者如果你想要它快,你可以做类似的事情:
return (rand() & 0xff) * 7;
答案 1 :(得分:5)
随机生成一个可被7整除的数字的最有效方法是生成一个随机数,然后乘以7。
return ( rand() % ( INT_MAX / 7 ) ) * 7
答案 2 :(得分:0)
为什么要生成一堆随机数,然后随意选择其中一个?您已经拥有核心思想:生成一个随机数并将其乘以7. potentialNums
数组不会添加任何值。
答案 3 :(得分:0)
为了加快速度,首先使用快速随机生成函数found here,这应该会更快地创建random的实际过程,
接下来,您可以将随机乘以7并且它将始终是7的倍数,但是,如果此乘法导致int溢出(可能有randoms),您可以始终采用前几个的掩码比特并将它们相乘。
e.g。
randomNumber = (generatedRandom & 0x00FFFFFF) * 7