C로 random number 를 발생 시켜야 되거든여..
0 ~ 1 사이에서여.. 어케 하는 거져???
좀 갈켜 주세여..
그리고 random() 함수를 쓰고 계속 실행 시키면
실행 시킬 때마다 같은 값들만 나오자나여? 왜 그런거져?
안 그러게 할려면 어케 하는 거죠?
그럼 고수님들의 답변 기다리겠습니다.
좋은 하루....^^
대충 만들어 봤네요. 해답은 srand () 함수에 있습니다.
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <unistd.h>
int main (int argc, char* argv []) { int i; time_t curr_time;
curr_time = time (0); srand (curr_time); for (i = 0; i < 10; i++) printf ("%f\n", (float)((random () % 100) / 100.)); }
답변 감사 합니다. 근데 한번 실행 하면 잘 나오는데
두번째 부터는 첫번째 나왔던 값 그대로 나오는데여?
왜 그렇져?
엄밀하게 컴퓨터 상에서는 random이 존재할 수 없습니다. 왜냐하면 컴퓨터는 결정적인 기계인데 비결정적인 random을 만들 순 없겠죠. 그래서 pseudo random 라 부르며 랜덤처럼 보이는 수열을 이용하여 랜덤을 구현합니다.
처음 seed값을 이용하여 첫번째 랜덤을 구하고, 첫번째 랜덤 값을 이용하여 두번째 랜덤값을 구하고...
마치 점화식과 비슷한 형태를 띠고 있습니다.
그래서, seed값이 같으면 동일한 랜덤 수열이 나오겠죠. 그래서 매번 seed를 다른 걸로 넣어주는 것입니다. 그게 srand 함수이고 가장 보편적인 seed 지정 방법은 시간에서 초 단위를 이용하는 방법입니다. 아무래도 seed가 중복될 확률이 적으니까
잘 이해가 안가시면, 이산수학 책이나 알고리즘 책이나 자료 구조책 중에 뒤져 보면 비슷한 내용이 나올 겁니다.
혹시 원하시는 게, random 값이 아닌, 유니크한 값이 아닌가요?
윗 에서 어떤 분이 말씀하셨듯이 seed 값을 동일하게 주면 같은 결과가 나옵니다. random 함수는 seed 값에다가 수학적인 공식을 적용해서 값을 산출해내거든요.
따라서 seed 값을 매번 다르게 해야죠.
보통 현재의 초를 나타내는 time stamp 를 많이 쓰는 데, 그 1초 내에 다른 랜덤 값이 하나 이상 필요하다면, 안됩니다.
천분의 1초를 나타내는 (마이크로 초) 값을 seed 로 쓴다고 해도 이런 문제는 안풀리죠.
하지만, 이 값이 랜덤값 그 자체로 사용된다면 큰 상관이 없겠지만, 유니크한 값으로 취급 되어야한다면, 곤란하겠네요.
이 때는 여러가지 다른 방법을 혼합해야할 듯...
전, 프로레스 번호, 프로세스 실행 순서, 시간 (초, clock, micro 초 등의) random 값 등을 사용해서 유니크 스트링을 만듭니다.
그럼,
LeeRock wrote.. 엄밀하게 컴퓨터 상에서는 random이 존재할 수 없습니다. 왜냐하면 컴퓨터는 결정적인 기계인데 비결정적인 random을 만들 순 없겠죠. 그래서 pseudo random 라 부르며 랜덤처럼 보이는 수열을 이용하여 랜덤을 구현합니다. 처음 seed값을 이용하여 첫번째 랜덤을 구하고, 첫번째 랜덤 값을 이용하여 두번째 랜덤값을 구하고... 마치 점화식과 비슷한 형태를 띠고 있습니다. 그래서, seed값이 같으면 동일한 랜덤 수열이 나오겠죠. 그래서 매번 seed를 다른 걸로 넣어주는 것입니다. 그게 srand 함수이고 가장 보편적인 seed 지정 방법은 시간에서 초 단위를 이용하는 방법입니다. 아무래도 seed가 중복될 확률이 적으니까 잘 이해가 안가시면, 이산수학 책이나 알고리즘 책이나 자료 구조책 중에 뒤져 보면 비슷한 내용이 나올 겁니다.
srand function 은 아래와 같이 선언되어 있습니다. seed값이 같으면 같은 값이 나오겠죠 ^^;
void srand( unsigned int seed );
그래서 for(i=0; i<3 ; i++) { srand(time(0)); . . . } 이렇게 하면 서로 다른 3개의 랜덤값을 얻을 수 없습니다.
^^;; 김승찬 님께서 무려 5년이 넘은 글에 답글을 다셨군요....
그런데.. 위와 같은 방법은 문제가 있더군요... for문을 돌면서 srand 값을 다시 입력하게되는데...
사실 돌려보면 for문이 너무 빨리도는지라 time(0)의 리턴값이 동일해서 srand를 다시 호출하는 의미가 별로 없더군요..
그래서 예전에 srand(time(0) + rand()) 식으로 했습니다만, 여러분들이 생각하시는 좀더 좋은 방안은 없나요?
갑자기 궁금해지네요... ^^
CPU clock 잡아서 nano second 값을 random seed로 사용하시면 될 듯합니다. 단, 링크할 때 -lrt 를 걸어줘야 한다는 거...
#include <time.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> int main () { pid_t pid; clockid_t clock_id; int ret; struct timespec t; pid = getpid (); ret = clock_getcpuclockid (pid, &clock_id); printf ("clock_getcpuclockid: ret = %d\n", ret); ret = clock_gettime (clock_id, &t); printf ("clock_getres: ret = %d\n", ret); srand (t.tv_nsec); for (i = 0; i < 10; i++) printf ("%f\n", (float)((random () % 100) / 100.)); } return 0; }
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
Re: uniform random number 어케 발생 시키는거죠..? ㅜㅡ;;
대충 만들어 봤네요.
해답은 srand () 함수에 있습니다.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
int main (int argc, char* argv [])
{
int i;
time_t curr_time;
curr_time = time (0);
srand (curr_time);
for (i = 0; i < 10; i++)
printf ("%f\n", (float)((random () % 100) / 100.));
}
Re^2: uniform random number 어케 발생 시키는거죠..? ㅜㅡ;;
답변 감사 합니다. 근데 한번 실행 하면 잘 나오는데
두번째 부터는 첫번째 나왔던 값 그대로 나오는데여?
왜 그렇져?
Re^3: uniform random number 어케 발생 시키는거죠..? ㅜㅡ;;
엄밀하게 컴퓨터 상에서는 random이 존재할 수 없습니다. 왜냐하면 컴퓨터는
결정적인 기계인데 비결정적인 random을 만들 순 없겠죠. 그래서 pseudo random
라 부르며 랜덤처럼 보이는 수열을 이용하여 랜덤을 구현합니다.
처음 seed값을 이용하여 첫번째 랜덤을 구하고,
첫번째 랜덤 값을 이용하여 두번째 랜덤값을 구하고...
마치 점화식과 비슷한 형태를 띠고 있습니다.
그래서, seed값이 같으면 동일한 랜덤 수열이 나오겠죠. 그래서 매번
seed를 다른 걸로 넣어주는 것입니다. 그게 srand 함수이고 가장
보편적인 seed 지정 방법은 시간에서 초 단위를 이용하는 방법입니다.
아무래도 seed가 중복될 확률이 적으니까
잘 이해가 안가시면, 이산수학 책이나 알고리즘 책이나 자료 구조책
중에 뒤져 보면 비슷한 내용이 나올 겁니다.
Re^4: 랜덤 값을 얻는 방법
혹시 원하시는 게, random 값이 아닌, 유니크한 값이 아닌가요?
윗 에서 어떤 분이 말씀하셨듯이 seed 값을 동일하게 주면 같은 결과가 나옵니다.
random 함수는 seed 값에다가 수학적인 공식을 적용해서 값을 산출해내거든요.
따라서 seed 값을 매번 다르게 해야죠.
보통 현재의 초를 나타내는 time stamp 를 많이 쓰는 데,
그 1초 내에 다른 랜덤 값이 하나 이상 필요하다면, 안됩니다.
천분의 1초를 나타내는 (마이크로 초) 값을 seed 로 쓴다고 해도 이런 문제는 안풀리죠.
하지만, 이 값이 랜덤값 그 자체로 사용된다면 큰 상관이 없겠지만,
유니크한 값으로 취급 되어야한다면, 곤란하겠네요.
이 때는 여러가지 다른 방법을 혼합해야할 듯...
전, 프로레스 번호, 프로세스 실행 순서, 시간 (초, clock, micro 초 등의)
random 값 등을 사용해서 유니크 스트링을 만듭니다.
그럼,
LeeRock wrote..
엄밀하게 컴퓨터 상에서는 random이 존재할 수 없습니다. 왜냐하면 컴퓨터는
결정적인 기계인데 비결정적인 random을 만들 순 없겠죠. 그래서 pseudo random
라 부르며 랜덤처럼 보이는 수열을 이용하여 랜덤을 구현합니다.
처음 seed값을 이용하여 첫번째 랜덤을 구하고,
첫번째 랜덤 값을 이용하여 두번째 랜덤값을 구하고...
마치 점화식과 비슷한 형태를 띠고 있습니다.
그래서, seed값이 같으면 동일한 랜덤 수열이 나오겠죠. 그래서 매번
seed를 다른 걸로 넣어주는 것입니다. 그게 srand 함수이고 가장
보편적인 seed 지정 방법은 시간에서 초 단위를 이용하는 방법입니다.
아무래도 seed가 중복될 확률이 적으니까
잘 이해가 안가시면, 이산수학 책이나 알고리즘 책이나 자료 구조책
중에 뒤져 보면 비슷한 내용이 나올 겁니다.
srand function 의 정의
srand function 은 아래와 같이 선언되어 있습니다.
seed값이 같으면 같은 값이 나오겠죠 ^^;
void srand( unsigned int seed );
그래서
for(i=0; i<3 ; i++)
{
srand(time(0));
.
.
.
}
이렇게 하면 서로 다른 3개의 랜덤값을 얻을 수 없습니다.
^^;; 김승찬 님께서 무려 5년이 넘는 글에 답글을 다셨군요..
^^;; 김승찬 님께서 무려 5년이 넘은 글에 답글을 다셨군요....
그런데.. 위와 같은 방법은 문제가 있더군요...
for문을 돌면서 srand 값을 다시 입력하게되는데...
사실 돌려보면 for문이 너무 빨리도는지라 time(0)의 리턴값이 동일해서
srand를 다시 호출하는 의미가 별로 없더군요..
그래서 예전에 srand(time(0) + rand()) 식으로 했습니다만,
여러분들이 생각하시는 좀더 좋은 방안은 없나요?
갑자기 궁금해지네요... ^^
CPU clock 잡아서 nano second 값을 random seed로 사용하시면...
CPU clock 잡아서 nano second 값을 random seed로 사용하시면 될 듯합니다.
단, 링크할 때 -lrt 를 걸어줘야 한다는 거...
댓글 달기