2014-01-11 104 views
0

我有一個for循環,裏面我產生隨機數並用time(msecs)播種它,但它不是隨機產生的,我該怎麼做來解決這個問題?在很短的時間間隔內產生大量的隨機數(C++)

說明: 我知道爲什麼rand()不是隨機生成它們的,我在尋求解決方案,並且我正在使用Qt創建器(如果有幫助的話)。

for(int j=0;j<5;j++){ 
     qsrand(QDateTime::currentDateTime().time().msec());//for every j itteratio i must 
     for(int i=1;i<s;i++){        //have new sequence and ret is 
     ret.push_back(rand()%s);       //vector i'm using Qt 
     }             //s=4 for now,but s=[1;50] 
     qDebug()<<"new sequence ..."; 
    } 

它生成 [2,1,1],[2,1,1],[2,1,1],[2,1,1],[2,1,1];

+5

你永遠不會從機器上獲得trully隨機性。你也應該種一次,而不是每次迭代。 –

+0

你是什麼意思,它不會隨機生成它們?你的意思是它總是給你同樣的數字序列?你的意思是它總是給你相同的號碼?生成一個隨機數所需的時間少於幾毫秒,所以你可能在很多時間使用相同的數字播種(種子在循環之外!)。 – FuzzyBunnySlippers

+0

從您發佈的代碼中,我得出結論,問題是由於一個錯誤。 –

回答

0

取決於您的應用程序。 如果您需要生成無法猜測的安全隨機數,那麼您應該使用CSPRNG https://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator。 對於這個purpouse有/ dev/urandom可用於unix克隆。

如果您需要隨機數字進行模擬或類似的需要隨機數字的地方,您應該使用高質量的超快速,隨機和大型PRNG,稱爲mersenne twister。
它可以在C++ 11的標準庫或boost中使用。 (僅標題)
http://en.cppreference.com/w/cpp/numeric/random/mersenne_twister_engine
http://www.boost.org/doc/libs/1_55_0/doc/html/boost_random.html

正如許多其他說,請確保您的種子只有一次。

+0

我一定會檢查他們 –

0

如果你想要一個很長的隨機數序列,就像這裏一樣,那麼你可能想要使用一個僞隨機數生成器(除非這是用於加密!)。 C++ 11將隨機和僞隨機數支持到標準庫中,這使得它非常易於使用。只需在循環之前用一個真正的隨機數對PRNG進行種子處理,然後使用它的輸出來獲得(僞)隨機數。您還需要包含random標題。

std::random_device rd; 
std::default_random_engine e1{rd()}; 
std::cout << e1(); // random number 
std::cout << e1(); // another random number 

std::uniform_int_distribution<> dist{1, 6}; 
std::cout << dist(e1); // random integer between 1 and 6 

如果這是密碼學應用,請參閱Luka Rahne的說法。

相關問題