uniform random number 어케 발생 시키는거죠..? ㅜㅡ;;

익명 사용자의 이미지

C로 random number 를 발생 시켜야 되거든여..

0 ~ 1 사이에서여.. 어케 하는 거져???

좀 갈켜 주세여..

그리고 random() 함수를 쓰고 계속 실행 시키면

실행 시킬 때마다 같은 값들만 나오자나여? 왜 그런거져?

안 그러게 할려면 어케 하는 거죠?

그럼 고수님들의 답변 기다리겠습니다.

좋은 하루....^^

익명 사용자의 이미지

대충 만들어 봤네요.
해답은 srand () 함수에 있습니다.

#include &ltstdio.h&gt
#include &ltstdlib.h&gt
#include &lttime.h&gt
#include &ltunistd.h&gt

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개의 랜덤값을 얻을 수 없습니다.

bejoy4him의 이미지

^^;; 김승찬 님께서 무려 5년이 넘은 글에 답글을 다셨군요....

그런데.. 위와 같은 방법은 문제가 있더군요...
for문을 돌면서 srand 값을 다시 입력하게되는데...

사실 돌려보면 for문이 너무 빨리도는지라 time(0)의 리턴값이 동일해서
srand를 다시 호출하는 의미가 별로 없더군요..

그래서 예전에 srand(time(0) + rand()) 식으로 했습니다만,
여러분들이 생각하시는 좀더 좋은 방안은 없나요?

갑자기 궁금해지네요... ^^

panda005의 이미지

CPU clock 잡아서 nano second 값을 random seed로 사용하시면 될 듯합니다.
단, 링크할 때 -lrt 를 걸어줘야 한다는 거...

#include &lt;time.h&gt;
#include &lt;stdio.h&gt;
#include &lt;unistd.h&gt;
#include &lt;sys/types.h&gt;
 
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;
}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.