2014-04-29 83 views
2

我正在尋找一種算法,允許我生成僞隨機數,但..我怎樣才能間隔數字的n位?如果你對C++的一個例子將是巨大的如何生成一個n位的長度

例如:

BigNumber隨機(位256)

我怎樣才能獲得最少,數量最多的256位

感謝所有好,我發現了溶液

如果我有n位,數量也(2^N)/ 2和(2^N)-1

+0

在C++ 11'的std :: uniform_int_distribution '可能是有用的。 – Jarod42

+0

這是一個相當奇怪的要求。你真的想解決什麼問題? –

回答

2

如果之間的隨機數i中的類型s int,你可以使用&算子通過使用合適的位掩碼來掩蓋不必要的位,例如,前四位爲二進制00001111

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

一般來說,你應該添加一個檢查,如果n較小然後31

+0

我認爲最好做rand()* 1.0/RAND_MAX *(1 << n) – Ralor

+0

在C++ 11中更好:使用'std :: uniform_int_distribution ' – Jarod42

+0

你可能想檢查一下。如果我調用'getNBitRandom(2)',你的函數將返回'rand()%4',這不符合OP的要求。他想要一個範圍爲'2 ^(n-1)<= x <(2^n)-1'的數字。所以'getNBitRandom(2)'應該返回'10'或'11'。 –

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) 

第一蘭特()返回最低的15位,第二個位15-29,最後一個比特30和31

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); 
0

你可以設置一個範圍是這樣的:

int rangeMin = 1, 
    rangeMax = 100, 
    generatedNumber; 

generatedNumber = rangeMin + rand() % rangeMax; 
相關問題