2012-12-18 31 views
-1

經過一段時間的問題解答和搜索結果,我發現自己的痛苦是沒有任何「隨機」發生器是真正隨機的,我的意思是隨機的?完全隨機性,我在編譯它們並運行多次運行後發現的所有算法都會打印大量值,結果是相同的,或者至少可以找到一個模式。這是非常糟糕的,我爲MMO服務器做了一個隨機數字生成器,其功能將來自升級項目,將一組玩家分成團隊,模式總是不好,想象每次我重新啓動程序時生成相同的數字順序。我的想法是,得到一個隨機數的最好方法是攪亂時間,你永遠不知道什麼時候會發生什麼,以及時間是否精確甚至更好。我想出了一個很好的解決方案。一個更好的實數發生器

inline __int64 NanoTime() 
{ 
    struct { int low, high; } Nano; 

    __asm push EAX 
    __asm push EDX 
    __asm __emit 0fh __asm __emit 031h 
    __asm mov Nano.low, EAX 
    __asm mov Nano.high, EDX 
    __asm pop EDX 
    __asm pop EAX 

    return *(__int64 *)(&Nano); 

} 

static DWORD g_Prev = NanoTime(); 

__int64 xRandom(void) 
{ 
    __int64 Now = NanoTime() - g_Prev/2; 
    CString strRand, strLast; 
    strRand.Format("%I64d", Now); 
    strLast = strRand.GetAt(strRand.GetLength()-1); 
    strLast += strRand.GetAt(strRand.GetLength()-2); 
    return(atoi(strLast)); 
} 

Althought文本大,問題很簡單,我需要對實數發生器,它具有最小的算法儘可能的方向,我的解決方案被稱爲幾十萬次,每次二是不是我有什麼尋找,它只是在這裏給我一個我需要的方向暗示。

我已經看過boost,比如不使用最低位的命令,time(0)等等。但是都有一個模式。

+0

我建議你在密碼部分發帖。現實情況是,真正的隨機性無法得到保證,但要具有一些隨機性的外表,您需要通過統計測試來運行算法以確保隨機性。 –

+0

Random.org有[API](http://www.random.org/clients/http/)。 –

+0

http:// stackoverflow。com/questions/1912199/better-random-algorithm – adripanico

回答

5

我編譯它們並運行多次後發現的所有算法都打印出大量值,結果是相同的或者至少有一個模式被發現。

坦率地說,聽起來您嘗試的算法很差,或者您對如何使用或評估它們的方式存在某些次優的問題。

如果標準rand()是不夠的(這是一個很大的!),你最好的選擇是一個更高級的僞隨機生成器,如Mersenne Twister。這些算法已被證明可以通過各種統計隨機性測試。

如果您需要選擇使用的硬件,最近的(Ivy Bridge)英特爾硬件提供了一個內置熵源的片上隨機數生成器:RDRAND。這提供了良好的隨機性和高吞吐量,但可能是您的需求矯枉過正。

想象每次我重新生成相同的數字順序

如果這是一個問題的程序,它聽起來就像你無法正常播種的發電機。如果你每次運行一次,並使用當前時間作爲種子,你將在不同的運行中得到不同的隨機序列。

我想出了一個很棒的解決方案。

如果我正確地閱讀你的代碼,你的熵源是TSC modulo 100。嘗試在緊密的循環中調用你的發生器,看看它是如何隨機的。

+3

「非常差,或者存在某種次優」或者提問者具有在隨機數據中發現明顯模式的共同人才天賦。 –