srand() 함수는 rand() 함수의 seed를 설정하는 함수입니다.
이런 함수가 필요한 이유는 rand() 함수가 랜덤한 값을 반환하지 않기 때문입니다. OS인지 CPU 인지 확실하지 않지만 미리 생성된 random number table이 있어서 여기서 하나씩 반환할 뿐입니다. 그래서 seed 즉 시작 값을 설정하지 않으면 rand() 함수는 항상 동일한 값을 반환하면서 시작합니다. 물론 다음 값들도 서로 동일하겠죠...
srand()의 입력값을 역시 또 동일한 값을 사용하면 동일한 순서에 의해서 rand()의 값들이 반환됩니다.
이래서 srand(time(NULL)) 형태로 호출하여 현재 시간에 따라서 seed를 바꾸어 rand()의 반환값이 실제로 랜덤한 효과를 가져다 줍니다.
srand는 프로그램이 시작하면 한번 불러주면 됩니다. loop을 돌면서
srand는 프로그램이 시작하면 한번 불러주면 됩니다. loop을 돌면서 부르면 안되지요.
---
http://coolengineer.com
나노초 % 1000 을 곱 하세요..ㅎㅎ
나노초 % 1000 을 곱 하세요..ㅎㅎ
----------------------------------------------------------------------------
ㅋㅋㅋ
이게 확실한 정답인듯...
세상은 하나..........
Re: 1초이내에 랜덤값을 여러개 구해올때...
사실 rand는 그다지 고르게 분포되지 않습니다.
적당한 prng(pseudo random number generator)를
찾아보시거나,
man BN_rand 해보셔요.
Re: ㅋㅋㅋ
srand는 왜 반복해서 부르면 안되는 거죠? 부하를 많이 일으키나요? 그냥 간단한 테스트를 할때.. rand값이 일정하게 나오길래 srand에서 seed를 time()+rand() 로 놓고.. 막돌렸던 기억이 나네요..
while(condition){
srand(time()+rand());
rand()
}
대충 이런식으루요...
나노초%1000 같은 것도 경험상 그다지 random하게 나오지 않았던것 같구요..
seed 값은 한번 또는 가끔 정해주는게 맞습니다. 시드 값은 보통 현재
seed 값은 한번 또는 가끔 정해주는게 맞습니다. 시드 값은 보통 현재 시각으로 설정하는 경우가 많고 더 한다면, 비디오 메모리의 특정 값, 사용자의 입력이 있을 때의 시각 등 다양한 값으로 선택을 하고 이들을 중복하는 경우도 있습니다.
보통의 srand 는 시드 값을 내부의 정적 변수나 TLS 에 저장해놓는 역할을 하고 반복적인 rand 호출 때, 임의 값을 돌려주게 되어 있습니다.
한번 srand, rand 의 구현을 조사해보시면 srand 를 여러번 불러봐야 소용없다는 것을 아시게 될 것입니다.
초기값에 따라 다음 값들이 무작위로 출력되는 특성을 이해하시면 궁금증이 풀리실 것이라 생각됩니다.
srand는 마치 이미 정해져 있는 random number sequen
srand는 마치 이미 정해져 있는 random number sequence table을 선택하는 것이나 마찬가지라고 생각하시면 됩니다.
---
http://coolengineer.com
Re: 1초이내에 랜덤값을 여러개 구해올때...
random number를 정말 random하게 만들어내는 것은 무척 어럽다고 들었습니다.
이공계에서 많이 사용하는 random number generator가 있어요.
Numerical Recipes in C, Second Edition
(Press, Teukolsky, Vetterling, and Flannery 1992)의 7장에
잘 설명되어있는 rand0, rand1, rand2라는 함수입니다.
각각 주기가 2^31~2x10^9, Unknown, longer than 2x10^18이라고 설명되어
특히, rand1의 경우는 randomness에대한 statisitcal test에서 실패한 적이 없다고
설명하고 있습니다.
Numerical Recipes의 홈페이지는 아래와 같고,
http://www.nr.com/
책은 On-line에서도 볼 수가 있는데 개인적인 용도로 사용하는 목적으로 인쇄해서
1부를 가질 수 있습니다.
http://www.library.cornell.edu/nr/
인라인 어셈 쓸 수 있다면 rdtsc 명령도 쓸만합니다.cpu 클럭카
인라인 어셈 쓸 수 있다면 rdtsc 명령도 쓸만합니다.
cpu 클럭카운트를 64비트로 넘겨주죠. (EDX:EAX)
대략 클래식 펜티엄 이상이면 돌아가는데,
요즘에는 그 이상은 다 되겠죠.
Written By the Black Knight of Destruction
[quote="Necromancer"]인라인 어셈 쓸 수 있다면 rdts
rdtsc는 뭔가요?
워낙에 처음 보는 거라? ㅡㅡㅋ
설명을 좀...
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
[quote="서지훈"]rdtsc는 뭔가요?워낙에 처음 보는 거라?
시피유가 동작후 카운트되는 값입니다. 64비트이고
매 클럭마다 1씩 증가입니다. 보통 정밀한 타임머를 만들
기 위해 사용합니다.
윈도우에서는
QueryPerfomanceFrequency(),
QueryPerformanceCounter()
라는 함수를 이용해 사용할수 있습니다.
[quote="Necromancer"]인라인 어셈 쓸 수 있다면 rdts
random의 seed로 쓸 수는 있겠지만, 역시 반복해서 읽어와 사용하는 건 좋지 않습니다.
/dev/urandom을 열어서 그냥 읽어오는것도 좋은 방법...
/dev/urandom
을 열어서 그냥 읽어오는것도 좋은 방법...
Re: ㅋㅋㅋ
srand() 함수는 rand() 함수의 seed를 설정하는 함수입니다.
이런 함수가 필요한 이유는 rand() 함수가 랜덤한 값을 반환하지 않기 때문입니다. OS인지 CPU 인지 확실하지 않지만 미리 생성된 random number table이 있어서 여기서 하나씩 반환할 뿐입니다. 그래서 seed 즉 시작 값을 설정하지 않으면 rand() 함수는 항상 동일한 값을 반환하면서 시작합니다. 물론 다음 값들도 서로 동일하겠죠...
srand()의 입력값을 역시 또 동일한 값을 사용하면 동일한 순서에 의해서 rand()의 값들이 반환됩니다.
이래서 srand(time(NULL)) 형태로 호출하여 현재 시간에 따라서 seed를 바꾸어 rand()의 반환값이 실제로 랜덤한 효과를 가져다 줍니다.
세상은 하나..........
이건 어떨지?
안녕하세요?
커널에서 제공해주는 /dev/urandom 값을 읽어와서 이용하세요.
일반적인 파일IO처럼 쓰시면 될 겁니다.
(실제로 파일IO가 발생하는 것은 아니고 커널과 통신해서 커널에서 제공하는 값을 이용합니다.)
저도 라이브러리 찾고 좋은 알고리즘 찾다가 결국 저걸로 해버렸습니다.
그럼...
[quote="ㅡ,.ㅡ;;"]나노초 % 1000 을 곱 하세요..ㅎㅎ[/
이방법 재미있네요.. 근데 실제로 돌려보니 중복된게 생기는데..
왜 그런건지..
헛..
헛.. 다른 분이 이미 urandom에 대한 답변을 달아주셨군요.
(뒷북...)
/dev/random과 /dev/urandom의 특징들은 맨페이지에 자세히 나와있으니 참조하시면 될 겁니다.
댓글 달기