1초이내에 랜덤값을 여러개 구해올때...

newfrog의 이미지

srand로 seed값을 쓰면,
1초 이내의 랜덤값은 똑같은데,

(-.-)a 이 1초의 한계를 극복할 수 없을까요?
loop안에 random이 있으니, 1초이지만 엄청난 중복 숫자가 나와서요.

무작위 랜덤값 추출을 여러번(1000번이상) 반복할 경우에 되도록이면 고르게 분포되게 출력할 수는 없을까요?

질문이 엉뚱해서 죄송합니다.

pynoos의 이미지

srand는 프로그램이 시작하면 한번 불러주면 됩니다. loop을 돌면서 부르면 안되지요.

ㅡ,.ㅡ;;의 이미지

나노초 % 1000 을 곱 하세요..ㅎㅎ


----------------------------------------------------------------------------

ssoo76의 이미지

pynoos wrote:
srand는 프로그램이 시작하면 한번 불러주면 됩니다. loop을 돌면서 부르면 안되지요.

이게 확실한 정답인듯...

세상은 하나..........

urmajest의 이미지

newfrog wrote:
무작위 랜덤값 추출을 여러번(1000번이상) 반복할 경우에 되도록이면 고르게 분포되게 출력할 수는 없을까요?

질문이 엉뚱해서 죄송합니다.

사실 rand는 그다지 고르게 분포되지 않습니다.

적당한 prng(pseudo random number generator)를

찾아보시거나,

man BN_rand 해보셔요.

bejoy4him의 이미지

ssoo76 wrote:
pynoos wrote:
srand는 프로그램이 시작하면 한번 불러주면 됩니다. loop을 돌면서 부르면 안되지요.

이게 확실한 정답인듯...

srand는 왜 반복해서 부르면 안되는 거죠? 부하를 많이 일으키나요? 그냥 간단한 테스트를 할때.. rand값이 일정하게 나오길래 srand에서 seed를 time()+rand() 로 놓고.. 막돌렸던 기억이 나네요..

while(condition){
srand(time()+rand());
rand()
}
대충 이런식으루요...

나노초%1000 같은 것도 경험상 그다지 random하게 나오지 않았던것 같구요..

bugiii의 이미지

seed 값은 한번 또는 가끔 정해주는게 맞습니다. 시드 값은 보통 현재 시각으로 설정하는 경우가 많고 더 한다면, 비디오 메모리의 특정 값, 사용자의 입력이 있을 때의 시각 등 다양한 값으로 선택을 하고 이들을 중복하는 경우도 있습니다.

보통의 srand 는 시드 값을 내부의 정적 변수나 TLS 에 저장해놓는 역할을 하고 반복적인 rand 호출 때, 임의 값을 돌려주게 되어 있습니다.

한번 srand, rand 의 구현을 조사해보시면 srand 를 여러번 불러봐야 소용없다는 것을 아시게 될 것입니다.

초기값에 따라 다음 값들이 무작위로 출력되는 특성을 이해하시면 궁금증이 풀리실 것이라 생각됩니다.

pynoos의 이미지

srand는 마치 이미 정해져 있는 random number sequence table을 선택하는 것이나 마찬가지라고 생각하시면 됩니다.

BuzzLy의 이미지

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/

urmajest wrote:
newfrog wrote:
무작위 랜덤값 추출을 여러번(1000번이상) 반복할 경우에 되도록이면 고르게 분포되게 출력할 수는 없을까요?

질문이 엉뚱해서 죄송합니다.

사실 rand는 그다지 고르게 분포되지 않습니다.

적당한 prng(pseudo random number generator)를

찾아보시거나,

man BN_rand 해보셔요.

Necromancer의 이미지

인라인 어셈 쓸 수 있다면 rdtsc 명령도 쓸만합니다.
cpu 클럭카운트를 64비트로 넘겨주죠. (EDX:EAX)

대략 클래식 펜티엄 이상이면 돌아가는데,
요즘에는 그 이상은 다 되겠죠.

Written By the Black Knight of Destruction

서지훈의 이미지

Necromancer wrote:
인라인 어셈 쓸 수 있다면 rdtsc 명령도 쓸만합니다.
cpu 클럭카운트를 64비트로 넘겨주죠. (EDX:EAX)

대략 클래식 펜티엄 이상이면 돌아가는데,
요즘에는 그 이상은 다 되겠죠.


rdtsc는 뭔가요?
워낙에 처음 보는 거라? ㅡㅡㅋ
설명을 좀...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

rasungboy의 이미지

서지훈 wrote:
rdtsc는 뭔가요?
워낙에 처음 보는 거라? ㅡㅡㅋ
설명을 좀...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

시피유가 동작후 카운트되는 값입니다. 64비트이고

매 클럭마다 1씩 증가입니다. 보통 정밀한 타임머를 만들

기 위해 사용합니다.

윈도우에서는

QueryPerfomanceFrequency(),
QueryPerformanceCounter()

라는 함수를 이용해 사용할수 있습니다.

cdpark의 이미지

Necromancer wrote:
인라인 어셈 쓸 수 있다면 rdtsc 명령도 쓸만합니다.
cpu 클럭카운트를 64비트로 넘겨주죠. (EDX:EAX)

대략 클래식 펜티엄 이상이면 돌아가는데,
요즘에는 그 이상은 다 되겠죠.

random의 seed로 쓸 수는 있겠지만, 역시 반복해서 읽어와 사용하는 건 좋지 않습니다.

익명 사용자의 이미지

/dev/urandom
을 열어서 그냥 읽어오는것도 좋은 방법...

ssoo76의 이미지

bejoy4him wrote:
ssoo76 wrote:
pynoos wrote:
srand는 프로그램이 시작하면 한번 불러주면 됩니다. loop을 돌면서 부르면 안되지요.

이게 확실한 정답인듯...

srand는 왜 반복해서 부르면 안되는 거죠? 부하를 많이 일으키나요? 그냥 간단한 테스트를 할때.. rand값이 일정하게 나오길래 srand에서 seed를 time()+rand() 로 놓고.. 막돌렸던 기억이 나네요..

while(condition){
srand(time()+rand());
rand()
}
대충 이런식으루요...

나노초%1000 같은 것도 경험상 그다지 random하게 나오지 않았던것 같구요..

srand() 함수는 rand() 함수의 seed를 설정하는 함수입니다.
이런 함수가 필요한 이유는 rand() 함수가 랜덤한 값을 반환하지 않기 때문입니다. OS인지 CPU 인지 확실하지 않지만 미리 생성된 random number table이 있어서 여기서 하나씩 반환할 뿐입니다. 그래서 seed 즉 시작 값을 설정하지 않으면 rand() 함수는 항상 동일한 값을 반환하면서 시작합니다. 물론 다음 값들도 서로 동일하겠죠...

srand()의 입력값을 역시 또 동일한 값을 사용하면 동일한 순서에 의해서 rand()의 값들이 반환됩니다.

이래서 srand(time(NULL)) 형태로 호출하여 현재 시간에 따라서 seed를 바꾸어 rand()의 반환값이 실제로 랜덤한 효과를 가져다 줍니다.

세상은 하나..........

godyang의 이미지

안녕하세요?

커널에서 제공해주는 /dev/urandom 값을 읽어와서 이용하세요.

일반적인 파일IO처럼 쓰시면 될 겁니다.
(실제로 파일IO가 발생하는 것은 아니고 커널과 통신해서 커널에서 제공하는 값을 이용합니다.)

저도 라이브러리 찾고 좋은 알고리즘 찾다가 결국 저걸로 해버렸습니다.

그럼...

xwizardx의 이미지

ㅡ,.ㅡ;; wrote:
나노초 % 1000 을 곱 하세요..ㅎㅎ

이방법 재미있네요.. 근데 실제로 돌려보니 중복된게 생기는데..

왜 그런건지..

godyang의 이미지

헛.. 다른 분이 이미 urandom에 대한 답변을 달아주셨군요.
(뒷북...)

/dev/random과 /dev/urandom의 특징들은 맨페이지에 자세히 나와있으니 참조하시면 될 겁니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.