如何生成长度为n位的数字

时间:2014-04-29 09:28:57

标签: c++ algorithm bits

我正在寻找一种允许我生成伪随机数的算法,但是..我怎样才能得到n位数的区间?如果你有一个c ++的例子会很棒

例如:

BigNumber随机(位256)

如何获得最少和最多的256位数

感谢所有人,我找到了解决方案

如果我有n位,则数字在(2 ^ n)/ 2和(2 ^ n)-1之间

5 个答案:

答案 0 :(得分:2)

如果随机数的类型为int,则可以使用&运算符通过使用合适的位掩码来屏蔽不必要的位,例如前四位的二进制00001111

答案 1 :(得分:1)

rand()函数返回0到RAND_MAX之间的数字。如果n小于RAND_MAX中的位数,则可以使用:

rand() % (1<<n)

但是,如果n大于RAND_MAX中的位数,则需要生成几个随机数并将它们组合起来。

例如,如果RAND_MAX为32767(15位)并且您需要32个随机位,则需要以下内容:

rand() ^ (rand() << 15) ^ ((rand() & 3)<<30) 

第一个rand()返回最低15位,第二个位15-29,最后一个位30和31。

答案 2 :(得分:0)

#include <stdlib.h>
int getNBitRandom( unsigned int n ) {
    return rand() % ( 1 << n );
}

一般情况下,如果n小于31,则应添加一项检查。

答案 3 :(得分:0)

对于最大为int大小的随机数,您可以使用以下函数:

unsigned int GetRandVal(int numOfBits)
{
    static int numOfBitsInRandMax = 0;
    if (numOfBitsInRandMax == 0)
    {
        srand((unsigned int)time(NULL));
        for (int randMax = RAND_MAX; randMax > 0; randMax >>= 1)
            numOfBitsInRandMax++;
    }
    int quotient  = numOfBits / numOfBitsInRandMax;
    int remainder = numOfBits % numOfBitsInRandMax;
    unsigned int randVal = 0;
    for (int i=0; i<quotient; i++)
        randVal = (randVal<<numOfBitsInRandMax)|rand();
    return (randVal<<remainder)|(rand()&((1<<remainder)-1));
}

对于较大的随机数,您可以多次调用此函数,并将每个返回的值存储在一个表示数字的数组中。例如,如果您需要256位随机数:

#define BITS_PER_INT (sizeof(int)*CHAR_BIT)

unsigned int array[256/BITS_PER_INT];
for (int i=0; i<256/BITS_PER_INT; i++)
    array[i] = GetRandVal(BITS_PER_INT);

答案 4 :(得分:0)

你可以设置这样的范围:

int rangeMin = 1,
    rangeMax = 100,
    generatedNumber;

generatedNumber = rangeMin + rand() % rangeMax;