랜덤은 랜덤한가?

kirrie의 이미지

디비에 더미데이터를 귀엽게 넣어주고 부하 테스트를 해야 할 필요가 있어서 스크립트를 짜다가
아무 생각 없이 random 함수를 사용했습니다.
몇십만건 정도 넣고 잠깐 쿼리를 돌려보니 결과가 고르게 들어가 있더군요. 예를 들어
a 필드에 1부터 1000까지의 난수가 들어가야 하고, 전체적으로 10만건이 있다면
1부터 1000까지는 거의 10개씩 들어가더라구요.

그러고보니 각각의 랭귀지에서 일반적으로 제공하는 랜덤 함수들은 랜덤하지 않다는 오랜 격언(?)이 떠올랐습니다,
정확하게 어떻게 랜덤하지 않은건지는 모르지만서도...

이래저래 찾다보니 real random 어쩌구 하는 사이트들도 있고 하더군요. (젠장, random.org에서 데이터 좀 뽑아
오려고 하니까 돈내라더군요. 궁시렁궁시렁... )

자, 전산 비전공자에게 어째서 랜덤 함수들이 랜덤하지 않은지 알려주실 분!
그리고 진짜 랜덤한 결과를 얻으려면 어떻게 해야하는지도 덤으로 알려주실 분!

(어쩌다 보니 질문글이... -_-;;)

댓글

hexagon의 이미지

저도 전산 비전공자...아니 심하게는 전산과 아주 동떨어진 전공을 그것도 이제 막 배우기 시작한(?) 3학년입니다.

근데 KLDP에서 랜덤 함수에 대한 글을 본거 같아요..

C의 경우는 난수표에서 값을 읽어와서 출력해주는 거라고 하더군요.
그 결과가 대체적으로 랜덤해 보이는건 여러개의 난수표중 난수표를 고를때 시스템 시간에 따라 다른 난수표를 선택하기때문에 중복된 결과를 피할 수 있다고 들었습니다.

진짜 랜덤한 값을 얻는 방법은 저도 모르겠군요..

이유는 모르겠지만 우리가 사용하는 프로세서가 난수를 생성 할 수 없기때문에 이런 편법을 사용한다고 들었습니다.

그렇다면 진짜 난수를 만들 수 있는 방법이 있을까요? 헉...저도 질문을...-_-

planetarium의 이미지

진짜 랜덤한 값을 얻으려면... 이런걸 쓰면 됩니다!
http://kr.engadget.com/2009/05/29/the%20dice%20rolling%20machine/

Hyun의 이미지

대단합니다!


나도 세벌식을 씁니다
auditory의 이미지

랜덤이라는건 현재까지의 결과로부터 다음에 나올 수를 예측할 수 없다라는걸
의미합니다.
모든게 규칙대로 돌아가는 컴퓨터 환경에서 진짜 랜덤을
발생시키는건 애초에 불가능하지만,
여러가지 방법으로 유사랜덤함수를 제공하고 있습니다.
보다 복잡한 방법으로 더 랜덤한 함수를 만들수도있고,
원하는 분포의 랜덤함수를 만들 수도 있습니다.
(Numerical recipes라는 책의 7장에서 이 주제를 다루고 있고,
코드도 있습니다. 또
Knuth, D.E. 1981, Seminumerical Algorithms, 2nd ed., vol. 2 of The Art of Computer Programming
(Reading, MA: Addison-Wesley), Chapter 3, especially §3.5. [1]
도 읽어보라고 나오네요..)

하지만
"a 필드에 1부터 1000까지의 난수가 들어가야 하고, 전체적으로
10만건이 있다면 1부터 1000까지는 거의 10개씩 들어가더라구요."

라고 해서 그 숫자들이 랜덤이 아니다라고 말하는 건 틀린 이야기입니다.
uniform random이라면 당연히 그렇게 나오는게 맞습니다.
주사위를 600만번 던지면 1부터 6까지 "거의" 100만번씩 나오는게 맞는것과 같습니다.

원하시는 random은 진짜random이 아니라, 다른 분포를 갖는 random이거나, 또는
부하테스트에 적합한 실제 상황을 모델링할 수 있는 deterministic data일 수도 있습니다.

kirrie의 이미지

Quote:
원하시는 random은 진짜random이 아니라, 다른 분포를 갖는 random이거나, 또는
부하테스트에 적합한 실제 상황을 모델링할 수 있는 deterministic data일 수도 있습니다.

이 말씀이 맞는 것 같습니다. 제가 질문을 제대로 표현을 못했네요. ^^
--->
데비안 & 우분투로 대동단결!

--->
데비안 & 우분투로 대동단결!

drinkme의 이미지

ruinfire의 이미지

시스템 시간을 long 형으로 해서 곱하면.. 되지 않을까염 ^^

균등한 일반 언어 랜덤 * 매 밀리초 달라지는 long 값

요정도면 균등하지 않은 랜덤값이 나오지 않을까요 : )

일반적으로 사용하는 방법인데 .. 흠..

요런걸 원하는게 아니신가요? -_-;

------------------------------------------------------
팔 어딘가가 간지러운데 찾아 긁을 수 없는? 그런 기분??

------------------------------------------------------
팔 어딘가가 간지러운데 찾아 긁을 수 없는? 그런 기분??

semmal의 이미지

수학적인 공식으로 구해지는 랜덤은 주기를 가지고 있어서, 찍다보면 언젠가는 숫자가 반복됩니다.

이 주기를 끊어서 살펴보면 균등분포가 되어버리죠.
------------------------------
How many legs does a dog have?

------------------------------
How many legs does a dog have?

wyb330의 이미지

일반적으로 난수발생기는 다음과 같은 식으로 발생시키게 됩니다.

R(t+1) = a*R(t) + b (a와 b는 소수인 상수입니다.)

즉 t+1번째 난수는 t번째 난수를 기준으로 생성합니다. 그래서 R(1) = a*R(0) + b이고 이 R(0)를 난수의 씨앗이라고 합니다.
이 씨앗값은 일반적으로 타이머를 이용해서 생성합니다. 위 식에서 알 수 있듯이 t+1번째 난수는 t번째 난수값에 의해서
결정되기 때문에 독립적으로 나온 값이 아니라는 걸 알 수 있죠. 그래서 보통 의사난수라고 하죠.

진짜 난수를 구하는 방법은 모르겠지만 난수발생 시간이 빨라야 한다는 조건을 만족하기는 어려울 것 같습니다.

Hyun의 이미지

커널에서 사용하는 랜덤의 경우는 하드디스크나 키보드 등의 주변장치 인터럽트 등을 이용해 랜덤 초기값을 얻는다고 알고있습니다. 혹시 관련부분 보충설명해주실 분 계신가요?


나도 세벌식을 씁니다
pastime의 이미지

커널에서 제공하는 난수 발생기인 /dev/random은
말씀하신대로 키보드/마우스 등의 입력 장치, 디스크 I/O, 기타 외부 장치의
인터럽트 발생 시간 및 입력 데이터를 통해 엔트로피를 제공받아 true randomness를 보장합니다.

하지만 엔트로피 풀의 크기가 작고 (512+a 바이트), 엔트로피가 채워지는 속도도 느리며
요청한 만큼의 엔트로피가 없는 경우에는 블로킹 되어버리므로
대량의 난수 데이터를 얻는 목적으로는 사용할 수 없습니다.
(이를 위해서는 /dev/random의 출력을 다른 CSPRNG의 seed로 사용하라는 것 같습니다.)

또다른 난수 발생기인 /dev/urandom을 사용하면
대량의 난수 데이터를 읽는 경우에도 이러한 블로킹은 막을 수 있지만
엔트로피를 제공받지 않는다면 true randomness는 보장할 수 없을 것입니다.

댓글 달기

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