2017-06-16 153 views
1

我有以下情況:我想生成M = 500,000個唯一的隨機數字之間的10 和2 -1。爲了簡化這種情況,我們可以假設,我們需要一個介於1和N = 2之間的數字。Qt:大量的唯一隨機quint64

我已經找到對此問題的參考文獻>here<>here<>here<

但我仍然有這樣的感覺,即如果N很小,參考文獻中提到的方法就可以工作。即將所有數字從1到N列出,並將它們混合並取第一個M是沒有選擇的。並且我認爲應該有比嘗試和錯誤更有效的方法,因爲M < < N.和M < <總是給出N.因此,如果N-M很小或者甚至N = M,那麼該算法不會很好。但不知何故,大n給出我頭疼......

與此相關的問題,我試圖擴大qrand()來獲得一個隨機`quint64與

quint64 MainWindow::longrand() 
{ 
    quint64 erg=(quint64)qrand(); 
    for(int i=0;i<4;i++) 
     erg=(erg<<(RAND_MAX+1))+qrand(); 
    erg=(erg<<16)+(qrand()%16); 
    return erg; 
} 

我知道這是不是一個很好的隨機數量,但它會是足夠的還是會給某些算法帶來問題?

+0

因此,您的整個問題只是您的'longrand'功能是否正常?你不是在問如何組織大量的數字並確保它們是唯一的? –

+3

面臨同樣的問題,即C運行時rand和qrand都不能生成質量隨機集。這是自C++ 11以來用現代C++處理的。沒有額外的框架需要:https://stackoverflow.com/questions/14009637/c11-random-numbers – AlexanderVX

+0

@大衛:不,我想問兩個。首先,有沒有2^64標誌運行O(M)的方法?其次,我的longrand()對於這種方法工作是否足夠好,還是會產生問題? –

回答

0

2^64-1是一個64位數字。 DES使用64位塊大小。使用固定密鑰,在ECB模式下使用DES對數字0,1,2,3,4 ...進行加密,以獲得所需數量的數字。由於輸入是唯一的,而且密鑰是固定的,所以64位輸出也是唯一的。

如果一個64位數字是< 10^16只是拒絕它並繼續下一個輸入整數。這將在每1800個數字(2^64/10^16)中發生約1個。

如果您記錄密鑰和最後使用的號碼,您可以根據需要向列表中添加更多號碼。

我假設您可以從Qt運行C++ DES實現。