2010-05-29 4 views
1

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_start0을 일관되게 반환합니다 (잘못된 타이머 해결로 인해).

기본적으로, (CPU_end - CPU_start)/(OS_end - OS_start) 항상 주위1000

어쨌든 등 CPU의 아마 부하, 온도, 석영 크리스탈 진동 결함의 엔트로피에 따라 약간의 변화와이 숫자가 꽤 ​​괜찮은 분포를 반환하지만 이것은 완전히 틀릴 수 있습니다. 나는 모른다.

편집 : 스티븐이나 너트에 따르면, Sleep(1) 그래서 대신 Sleep(1)의, 내가 기대하고있어 일을 할 수 없습니다, 내가 사용하려고 해요 :

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

답변

1

Sleep 기능은 시스템 시계의 해상도에 따라 제한되므로 Sleep (1)은 원하는 것을 수행하지 못할 수 있습니다.

1

의 범위를 증가시키기 위해 몇 가지 곱셈을 고려 . 그런 다음 결과를 사용하여 PRNG를 시드합니다.

관련 문제