随机生成可被N整除的数字的最佳算法

时间:2011-10-01 04:36:38

标签: c++ c algorithm

有更好的算法可以做到以下几点吗?

我正在尝试生成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?
    }

4 个答案:

答案 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