2016-05-23 596 views
4

我想用C++在0 - 2^64範圍內生成非常大的隨機數。我使用了rand()函數,但它不會生成很大的數字。任何人都可以幫忙嗎?如何在C++中生成非常大的隨機數

+0

做了一些你想讓這個號碼成爲一個號碼本身?或者只是像哈希這樣的字符串?或者你更喜歡把一個很長的數字作爲一個字符串? –

+0

你可能想參考:http://stackoverflow.com/questions/8120062/generate-random-64-bit-integer – Bettorun

+2

「非常大」?一個簡單的'std :: uint64_t'可以包含所有這些值。 –

回答

9

用C++ 11,使用標準random library of c++11,可以做到這一點:

#include <iostream> 
#include <random> 

int main() 
{ 
    /* Seed */ 
    std::random_device rd; 

    /* Random number generator */ 
    std::default_random_engine generator(rd()); 

    /* Distribution on which to apply the generator */ 
    std::uniform_int_distribution<long long unsigned> distribution(0,0xFFFFFFFFFFFFFFFF); 

    for (int i = 0; i < 10; i++) { 
     std::cout << distribution(generator) << std::endl; 
    } 

    return 0; 
} 

Live Demo

+1

從來沒有見過'API'這個詞用於這個。 –

+0

@GillBates,編輯 – coyotte508

+0

該解決方案僅生成大量數據。如果我想在0 - 2^64範圍內生成數字,該怎麼辦? –

-3

如果您rand()功能只適用於範圍[0, 2^15)給出的數字,那麼您可以連接通過rand()返回範圍[0, 2^64)獲得數5個號碼。

當然,還有其他可能的解決方案(可能會更好)。 C++庫中的rand()函數通常是linear congruential generator。你可以簡單地使用相同的數學原理實現你自己的發電機。

例如,下面的代碼生成64位的隨機數:

unsigned long long rand64() 
{ 
    static unsigned long long seed; 
    seed = seed * 6364136223846793005 + 1442695040888963407; 
    return seed; 
} 

參數63641362238467930051442695040888963407是那些使用高德納。

該方法的優點和缺點在上面的wiki頁面中討論。如果不需要高質量的隨機性,它可能是一個不錯的選擇。

+3

爲什麼異或實際上?爲什麼20位的分段?你會詳細說明這些神奇的數字嗎? –

+2

你能解釋一下return語句的邏輯嗎? –

+0

32768只有2^15,所以這些20的位移不會填滿所有的位。 – interjay

5

如在範圍[0, 2^64)均勻隨機數爲64只隨機比特,可以只是使用std::mt19937_64直接返回值:

#include <random> 

int main() { 
    std::mt19937_64 gen (std::random_device{}()); 

    std::uint64_t randomNumber = gen(); 
} 

注意播種梅森倍捻機發動機一個32位的種子不是最優的,爲了更好的方式,請看this

另請注意,最近通常不鼓勵使用randHere是由Stephan T. Lavavej就該主題發表的演講。

1

我寫了生成隨機19位數的函數它的運行方式與標準rand()函數完全相同。它從19位數字中提取每個數字並將它們存儲在一個數組中,然後將它們放在一起以製作非常大的隨機數。

unsigned long long Randomize() 
{ 
    unsigned long long randnumber = 0; 
    int digits[20]; 

    for (int i = 19; i >= 1; i--) 
    { 
     digits[i]=rand()%10: 
    } 
    for(int i=19; i>=1; i--) 
    { 
     unsigned long long power = pow(10, i-1); 

     if (power%2 != 0 && power != 1)  //eliminates "bug" (which comes from long long power is not a float)) 
      power++; 

     randnumber += power * digits[i]; 
    } 
return randnumber; 
} 

要使用此功能,你需要實現一些庫

#include <stdlib.h> 
#include <time.h> 
#include <math.h> 

例如:

srand(time(NULL)); 
randomnumber = Randomize()%10000000+10000000; 
在這種情況下,隨機數

是從千萬到20000000