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