Windows 용 시계 드리프트 RNG 코드를 찾을 수 없으므로 직접 구현하려고했습니다. I Sleep(1)
, 그것 때문에에게 나는 '돈 않다면 왜 당신이 궁금해하는 경우클럭 드리프트를 올바르게 구현 했습니까?
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);
}
... 난 아직 ent
또는 DIEHARD
까지의 숫자를 실행하지 않은,이 심지어 원격으로 맞다면 난 그냥 궁금하네요 t, OS_end - OS_start
은 0
을 일관되게 반환합니다 (잘못된 타이머 해결로 인해).
기본적으로, (CPU_end - CPU_start)/(OS_end - OS_start)
항상 주위1000
어쨌든 등 CPU의 아마 부하, 온도, 석영 크리스탈 진동 결함의 엔트로피에 따라 약간의 변화와이 숫자가 꽤 괜찮은 분포를 반환하지만 이것은 완전히 틀릴 수 있습니다. 나는 모른다.
편집 : 스티븐이나 너트에 따르면, Sleep(1)
그래서 대신 Sleep(1)
의, 내가 기대하고있어 일을 할 수 없습니다, 내가 사용하려고 해요 :
void loop() {
__asm {
mov ecx, 1000
cylcles:
nop
loop cylcles
}
}