2013-06-03 2 views
1

나는 5 개의 난수를 생성해야하는데, 그 목적을 위해 나는 clock의 인터럽트를 사용했다 : mov ah, 2ch int 21h. 나는 밀리 세컨드 (DL)를 썼고 이것은 무작위 수라고 생각했다. 하지만 5 번 같은 번호를 얻습니다. 인터럽트를 사용하여 문제를 해결할 다른 방법이 있다면 도움을주십시오. 당신이 작은 (의사) 난수가 필요한 경우시계의 인터럽트를 사용하여 난수 생성하기

+0

'rdtsc' 명령을 사용하십시오. –

+0

'DL'에는 밀리 초가 아닌 초 단위의 허드렛이 포함됩니다. 또한 : _ "참고 : 대부분의 시스템에서 시스템 클럭의 해상도는 약 5/100 초입니다."_ ([source] (http://www.ctyme.com/intr/rb-2703.htm)) – Michael

+2

가능하면 반복 가능하도록 설계된 데이터 소스와 낮은 속도로 업데이트하여 난수를 생성하는 것은 분명히 나쁜 생각입니다. –

답변

1

는 사용

rdtsc % N 
+2

임의의 숫자가 필요한 경우'rdrand'를 사용하십시오 ... http://software.intel.com/en-us/blogs/2011/06/22/find-out-about-intels-new-rdrand- 명령 - 타임 스탬프를 "무작위로"호출하는 함정에 빠지지 마십시오. 심지어 TSC와 같은 고해상도 타임 스탬프조차도 - 무작위성에 대한 기본 테스트, 즉 (비) 예측 가능성에 실패합니다. –

+0

사실, 내 대답을 편집했습니다. –

+0

컴퓨터에서 생성 된 임의의 난수는 무작위가 아닌 무언가로부터 파생되어야하기 때문에 가장 좋은 의사 난수라는 것을 언급 할 가치가 있습니다. –

2

rdrand는 (다른 답변 의견 참조) 프로세서가있는 경우 좋은 생각처럼 보인다. 인텔 CPU에 꽤 최근에 추가 된 것 같아요. 그렇다고 생각하지 않습니다. 또한 매우 빠르다고 생각하지 않습니다.

아니요, 어셈블리 코드에서 고속, 고품질 (의사) 난수를 원한다면 XORShift 난수 생성기가 꽤 좋은 것처럼 보입니다. 짧은 코드, 오랜 기간, 우수한 통계. 당신이, 당신이 할 수있는 클럭 값으로 종자 (예를 들어, RDTSC를) 초기화 할 경우

DATA_ALIGN_TO_CACHE_LINE 
    public XORRNGvalue32 
XORRNGvalue32 dword 2463534242   ; see COMPUTE_RANDOM32 macro 
; XORShift random number generator; see http://en.wikipedia.org/wiki/Xorshift 
; or Marsaglia, George (July 2003). "Xorshift RNGs". Journal of Statistical Software Vol. 8 (Issue 14). 

COMPUTE_RANDOM32 macro ; uses EAX and EDX 
; Marsaglia suggested 32 bit RNG: 
; unsigned long xor() 
; { static unsigned long y=2463534242; "32 bit seed value y" 
;  y =(y<<13); y^=(y>>17); return (y =(y<<5)); } 
     mov  eax, XORRNGvalue32 
     mov  edx, eax 
     shl  eax, 13 
     xor  eax, edx 
     mov  edx, eax 
     shr  eax, 17 
     xor  eax, edx 
     mov  edx, eax 
     shl  eax, 5 
     xor  eax, edx 
     mov  XORRNGvalue32, eax ; has nice random number in EAX here 
    endm 

: 여기에 내가 강탈하는 프로세서를 결정하는 A (32 비트) 작업 훔치는 SMP 프로세서 스케줄러에 무엇을 사용 그렇게.

매우 쉽게 64 비트 변형을 구현할 수 있습니다. 이것을 paper으로 백업 해보세요.

난수가 필요한 경우이 값을 5 번 호출해도됩니다. 나는 그것을 번이라고 부르고 그 중 하나를 버리도록 유혹 당할 것이다. 5 가지 다른 XOR/시프트 상수 (Marsaglia는 그의 논문에서 수십 가지를 가짐)를 사용하여 5 가지 루틴을 사용하는 것이 더 좋지만, 모두 동 기적으로 호출하면 모두 잠금 단계로 작동합니다. 인터럽트를 사용하여 그들 중 한 사람에게 중대한 전화를 걸어 그들을 단계적으로 노크 할 수 있습니다.

+0

Wrt. 'rdrand'의 속도에, 예를 들어 http://smackerelofopinion.blogspot.co.uk/2012/10/intel-rdrand-instruction-revisited.html을 확인하십시오. –

+0

이 기사는 초당 1 억 개의 난수 - 10 ns마다 1을 제안합니다. Marsaglia의 루틴의 64 비트 버전은 근본적으로 다른 상수를 사용하여 64 비트로 확장 된 명령어의 순서가 동일합니다. 이것들이 모두 순차적으로 실행되고, 각각이 약간의 클럭을 필요로한다고 가정하면, Marsaglia의 루틴은 약 20-30 클럭을 가져야 만합니다. 3 기가 헤르츠 기계에서 10 센트! Marasaglia의 발전기는 또한 "임의성"속성이 우수하다고 주장됩니다. ... –

+0

... 공급 업체별 지침과 동일한 속도와 품질의 일반 루틴 중 하나를 선택해야한다면 루틴을 선택해야합니다.인텔 지침의 실제 임의성은 아마도 암호화 프로토콜에 유용 할 것입니다. –