2010-05-29 69 views
1

我無法在任何地方找到任何時鐘漂移RNG代碼,所以我試圖自己實現它。我沒有經歷過entDIEHARD運行數着呢,我只是想知道這是否甚至遠程正確...我是否正確實施時鐘漂移?

void QueryRDTSC(__int64* tick) { 
__asm { 
    xor eax, eax 
    cpuid 
    rdtsc 
    mov edi, dword ptr tick 
    mov dword ptr [edi], eax 
    mov dword ptr [edi+4], edx 
} 
} 

__int64 clockDriftRNG() { 
__int64 CPU_start, CPU_end, OS_start, OS_end; 

// get CPU ticks -- uses RDTSC on the Processor 
QueryRDTSC(&CPU_start); 
Sleep(1); 
QueryRDTSC(&CPU_end); 


// get OS ticks -- uses the Motherboard clock 
QueryPerformanceCounter((LARGE_INTEGER*)&OS_start); 
Sleep(1); 
QueryPerformanceCounter((LARGE_INTEGER*)&OS_end); 

// CPU clock is ~1000x faster than mobo clock  
    // return raw 
return ((CPU_end - CPU_start)/(OS_end - OS_start)); 

    // or 
// return a random number from 0 to 9 
// return ((CPU_end - CPU_start)/(OS_end - OS_start)%10); 
} 

如果你想知道爲什麼我Sleep(1),這是因爲如果我不」 t,OS_end - OS_start一致返回0(因爲壞定時器分辨率,我假設)。

基本上,(CPU_end - CPU_start)/(OS_end - OS_start)總是返回基於CPU負載,也許溫度,石英晶體振動缺陷的熵的輕微變化等

反正周圍1000,數字有一個相當不錯的分佈,但這可能是完全錯誤的。我不知道。

編輯:根據斯蒂芬·納特,Sleep(1)可能不會做什麼,我很期待,所以不是Sleep(1),我試圖使用方法:

void loop() { 
__asm { 
    mov ecx, 1000 
    cylcles: 
    nop 
    loop cylcles 
} 
} 

回答

1

Sleep函數受限於系統時鐘的分辨率,所以Sleep (1)可能不會做你想要的。

1

考慮一些乘法增加射程。然後使用結果來種子PRNG。