1에서 n까지 난수를 생성하는 어셈블리 함수를 찾고 있습니다. n 값은 약 60000이 될 수 있습니다. 나는 그 일을하는 방법을 모른다. 나는 이것을 찾았고 내 감탄을 만난 것을 찾지 못했습니다.어셈블리에서 임의의 32 비트 숫자 생성
답변
선형 합동 생성기 :
r[n+1] = (a * r[n] + c) % m
m = 65537 (2 16 +1)
A = 65,538 (a - 1
m
중 프라임 제수의 배수, 및 단일 제수 m
이다해야 자체, 즉 65537)
c = 임의의 짝수 (c
과 m
은 서로가 소수 여야 함)
[Knuth, II vol., 3.2.1.1-3.2.1.2]
이것을 사용하고 싶습니다. Miller-Rabin primality test에서의 algorythm. 하지만,이 테스트에 전달 된 또 다른 숫자 인 변수를 전달합니다. 이 변수는 내 상위 범위입니다 (0 - 변수 -1) 어떻게이 algorythm 이것을 조정할 수 있습니까? – sheddar
대형 모듈을 사용하여 모든 LCG를 구현 한 다음 '범위'로 나누면 나머지를 가져갈 수 있습니다. http://en.wikipedia.org/wiki/Linear_congruential_generator에서 'a','c' 및'm'의 일반적인 값을 볼 수 있습니다. 'm'을 2의 거듭 제곱과 동일하게 사용하면 코드를 단순화 할 수 있습니다 (더 많은 난수 생성기가 필요한 경우 더 높은 결과 비트 사용). 결국'div'는 범위에 따라 임의의 숫자를 만들고,'dx' /'edx' 레지스터에서 나머지를 얻습니다. –
고마워, 그것은 작동하지만 모든 컴파일 후 생성 된 번호의 동일한 시퀀스를 얻을. 정상입니까? – sheddar
어떤 CPU에 대해? ARM, Motorola, Intel은 모두 조립 지침이 매우 다릅니다. –
어떤 플랫폼/어셈블러입니까? –
@ Erick J. Intel @Alex K. MASM x86 – sheddar