我正在寻找一种允许我生成伪随机数的算法,但是..我怎样才能得到n位数的区间?如果你有一个c ++的例子会很棒
例如:
BigNumber随机(位256)
如何获得最少和最多的256位数
感谢所有人,我找到了解决方案
如果我有n位,则数字在(2 ^ n)/ 2和(2 ^ n)-1之间
答案 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;