첫번째 방법을 되도록이면 추천합니다. 속도가 중요하다면 두번째 방법을 쓰세요.
첫번째 방법에 장점은 상당히 임의의수를 잘 만들어낸다는 것이고
두번째 방법은 속도가 빠르다는 겁니다.
[[[[[[[ 첫번째 방법 ]]]]]]]]]]]]]]
"/dev/urandom"
을 열어서 원하는 랜덤수의 크기만큼 읽으면
됩니다.
이게 제일 간단한 방법이죠.....
[[[[[[[ 두번째 방법 ]]]]]]]]]]]]]]
어셈으로 만드는것이 귀찮아서 C로 올립니다.
초기 Seed값은 Systemcall중에서 time을 호출했지만 여러가지 방법이
있겠죠....
그리고 곱하는 상수값은 정형화된 값이라서 많이 애용되는 값입니다.
random수에 관련된 학회에서 이것을 정했다고 하던데 저도 역사는 모릅니다.
unsigned int far pascal rand(void)
{
static unsigned long s_seed=(unsigned long)time(NULL);
s_seed=0x015a4e35LU*s_seed+1LU;
return((unsigned int)(s_seed>>16U)&0x7fff);
}
첫번째 방법을 되도록이면 추천합니다. 속도가 중요하다면 두번째 방법을 쓰
첫번째 방법을 되도록이면 추천합니다. 속도가 중요하다면 두번째 방법을 쓰세요.
첫번째 방법에 장점은 상당히 임의의수를 잘 만들어낸다는 것이고
두번째 방법은 속도가 빠르다는 겁니다.
[[[[[[[ 첫번째 방법 ]]]]]]]]]]]]]]
"/dev/urandom"
을 열어서 원하는 랜덤수의 크기만큼 읽으면
됩니다.
이게 제일 간단한 방법이죠.....
[[[[[[[ 두번째 방법 ]]]]]]]]]]]]]]
어셈으로 만드는것이 귀찮아서 C로 올립니다.
초기 Seed값은 Systemcall중에서 time을 호출했지만 여러가지 방법이
있겠죠....
그리고 곱하는 상수값은 정형화된 값이라서 많이 애용되는 값입니다.
random수에 관련된 학회에서 이것을 정했다고 하던데 저도 역사는 모릅니다.
Re: 어셈에서 임의의 수를 받아들이려면 어떤 식으로...?
어셈이라면 rdtsc 명령 쓰는 방법이 편할겁니다. 단, 펜티엄급 이상에서만 된다는거에
주의하셔야 할겁니다.
이거 쓰면 EDX:EAX에 CPU클럭 카운트에 따른 랜덤값이 들어오죠.
여기다 적당한 공식을 집어넣고 값을 꼬아넣으면 될겁니다.
한데 이게 권한을 요구하는 명령인지는 확인 안해봤습니다.
한번 해보고 올려보겠습니다.
Written By the Black Knight of Destruction
확인했습니다.
rdtsc는 non-previledged 명령입니다.
rdtsc 명령 집어넣은 코드를 NASM으로 어셈블해 봤더니
세그폴트같은거 없이 정상동작합니다.
Written By the Black Knight of Destruction
댓글 달기