나는 5 개의 난수를 생성해야하는데, 그 목적을 위해 나는 clock의 인터럽트를 사용했다 : mov ah, 2ch int 21h. 나는 밀리 세컨드 (DL)를 썼고 이것은 무작위 수라고 생각했다. 하지만 5 번 같은 번호를 얻습니다. 인터럽트를 사용하여 문제를 해결할 다른 방법이 있다면 도움을주십시오. 당신이 작은 (의사) 난수가 필요한 경우시계의 인터럽트를 사용하여 난수 생성하기
답변
는 사용
rdtsc % N
임의의 숫자가 필요한 경우'rdrand'를 사용하십시오 ... http://software.intel.com/en-us/blogs/2011/06/22/find-out-about-intels-new-rdrand- 명령 - 타임 스탬프를 "무작위로"호출하는 함정에 빠지지 마십시오. 심지어 TSC와 같은 고해상도 타임 스탬프조차도 - 무작위성에 대한 기본 테스트, 즉 (비) 예측 가능성에 실패합니다. –
사실, 내 대답을 편집했습니다. –
컴퓨터에서 생성 된 임의의 난수는 무작위가 아닌 무언가로부터 파생되어야하기 때문에 가장 좋은 의사 난수라는 것을 언급 할 가치가 있습니다. –
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 가지 루틴을 사용하는 것이 더 좋지만, 모두 동 기적으로 호출하면 모두 잠금 단계로 작동합니다. 인터럽트를 사용하여 그들 중 한 사람에게 중대한 전화를 걸어 그들을 단계적으로 노크 할 수 있습니다.
Wrt. 'rdrand'의 속도에, 예를 들어 http://smackerelofopinion.blogspot.co.uk/2012/10/intel-rdrand-instruction-revisited.html을 확인하십시오. –
이 기사는 초당 1 억 개의 난수 - 10 ns마다 1을 제안합니다. Marsaglia의 루틴의 64 비트 버전은 근본적으로 다른 상수를 사용하여 64 비트로 확장 된 명령어의 순서가 동일합니다. 이것들이 모두 순차적으로 실행되고, 각각이 약간의 클럭을 필요로한다고 가정하면, Marsaglia의 루틴은 약 20-30 클럭을 가져야 만합니다. 3 기가 헤르츠 기계에서 10 센트! Marasaglia의 발전기는 또한 "임의성"속성이 우수하다고 주장됩니다. ... –
... 공급 업체별 지침과 동일한 속도와 품질의 일반 루틴 중 하나를 선택해야한다면 루틴을 선택해야합니다.인텔 지침의 실제 임의성은 아마도 암호화 프로토콜에 유용 할 것입니다. –
- 1. 시스템 콜을 사용하여 난수 생성하기
- 2. PHP에서 난수 생성하기
- 3. SML로 난수 생성하기
- 4. 파이썬에서 난수 목록 생성하기
- 5. CUDA의 다양한 배포판에서 난수 생성하기
- 6. C#에서 신속하게 난수 생성하기
- 7. CUDA의 가우시안 분포에서 난수 생성하기
- 8. 매우 큰 난수 생성하기 java
- 9. Java for 루프에서 난수 생성하기
- 10. 0에서 1 사이의 쿠다 커널에서 난수 생성하기
- 11. 다른 2 개의 난수 생성하기 C#
- 12. 시계의 정밀도
- 13. matlab에서 공분산이 0 인 다 변수 일반 난수 생성하기
- 14. 부스트를 사용하여 1에서 9999 사이의 난수 생성
- 15. Qt를 사용하여 시계의 초침을 회전하는 방법
- 16. Java Help Beginner 특정 숫자까지 합쳐지는 난수 생성하기
- 17. 이전에 사용 된 것과 다른 난수 생성하기 C#
- 18. 벡터 시계의 구현
- 19. 아날로그 시계의 터치 이벤트
- 20. qemu 시계의 속도를 높이십시오.
- 21. 알림 바 - 시계의 너비?
- 22. ILog Elixir 시계의 예입니다.
- 23. Guard와 Compass 시계의 차이
- 24. 그래프 시계의 위치 고정
- 25. 시계의 고정 시간
- 26. 시계의 속도가 느린 타이머
- 27. 난수 발생기 난수 생성기
- 28. 난수 배열의 난수 행
- 29. 시스템 호출이 인터럽트를 사용하여 처리되는 이유는 무엇입니까?
- 30. BIOS 인터럽트를 사용하여 문자열을 인쇄하는 방법
'rdtsc' 명령을 사용하십시오. –
'DL'에는 밀리 초가 아닌 초 단위의 허드렛이 포함됩니다. 또한 : _ "참고 : 대부분의 시스템에서 시스템 클럭의 해상도는 약 5/100 초입니다."_ ([source] (http://www.ctyme.com/intr/rb-2703.htm)) – Michael
가능하면 반복 가능하도록 설계된 데이터 소스와 낮은 속도로 업데이트하여 난수를 생성하는 것은 분명히 나쁜 생각입니다. –