我正在尋找一種算法,允許我生成僞隨機數,但..我怎樣才能間隔數字的n位?如果你對C++的一個例子將是巨大的如何生成一個n位的長度
例如:
BigNumber隨機(位256)
我怎樣才能獲得最少,數量最多的256位
感謝所有好,我發現了溶液
如果我有n位,數量也(2^N)/ 2和(2^N)-1
我正在尋找一種算法,允許我生成僞隨機數,但..我怎樣才能間隔數字的n位?如果你對C++的一個例子將是巨大的如何生成一個n位的長度
例如:
BigNumber隨機(位256)
我怎樣才能獲得最少,數量最多的256位
感謝所有好,我發現了溶液
如果我有n位,數量也(2^N)/ 2和(2^N)-1
如果之間的隨機數i中的類型s int
,你可以使用&
算子通過使用合適的位掩碼來掩蓋不必要的位,例如,前四位爲二進制00001111
。
#include <stdlib.h>
int getNBitRandom(unsigned int n) {
return rand() % (1 << n);
}
一般來說,你應該添加一個檢查,如果n
較小然後31
。
rand()
函數返回0到RAND_MAX
之間的數字。如果n小於位的RAND_MAX
數,您可以使用此:
rand() % (1<<n)
然而,如果n大於RAND_MAX位的數量較大,則需要產生一些隨機數並結合他們。
例如,如果RAND_MAX爲32767(15位)和你想32個隨機比特你需要以下條件:
rand()^(rand() << 15)^((rand() & 3)<<30)
第一蘭特()返回最低的15位,第二個位15-29,最後一個比特30和31
對於隨機數最多的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);
你可以設置一個範圍是這樣的:
int rangeMin = 1,
rangeMax = 100,
generatedNumber;
generatedNumber = rangeMin + rand() % rangeMax;
在C++ 11'的std :: uniform_int_distribution'可能是有用的。 –
Jarod42
這是一個相當奇怪的要求。你真的想解決什麼問題? –