난수(random)에 관해...

IDNed의 이미지

난수 발생할때 나오는 난수는 진정한 난수일까요?

시드 값을 주면 그걸로 랜덤을 만드는데...
보통 (C/C++ 기준) 시드는 time(0)로 줍니다. 즉 초단위...

그러면 최소한 1초가 지나기 전에(초가 바뀌기 전에) 프로그램을 두번 실행시키면(엔터키 따닥) 랜덤의 결과가 같게 됩니다.
과연 이런 현상을 배제하는 방법은 없는 걸까요...

예를 들어

int main(){
   srand(time(0));
   for(int i=0;i<(rand()%1000);i++)
      srand(rand());
   cout << rand();
}

설마 이정도라 하더라도 초만 같으면 엄청 빨리 두번 실행시킬때 결과는 같게 됩니다.

이런 시드 의존성을 최소화하는 방법을 없을지요...

jachin의 이미지

횟수가 짝수와 홀수일 때를 정해서 0.5 를 기준으로 홀수일 때는 난수의 반을 더하고, 짝수일 때는 난수의 반과 0.5 를 더해서 이전 값과 곱한 후 소숫점 자리만 취한다던가,

아니면 이전값을 기억하고 그 값과 다시 곱한다던가...

분포를 넓히기 위한 식은 많습니다만, 그런 형식으로 만들다보면 분포가 다시 고르지 않을 확률도 높습니다.

인터넷으로 만드는 도박 게임의 경우도 이런 형태로 난수의 식을 변경해서 최대한 확률을 유리한 쪽으로 바꿉니다.

난수라는 것이 항상 잘 맞아 떨어지는 경우는 없습니다.

난수도 정의할 수 없는 패턴인 경우가 많이 발생하니까요....

익명 사용자의 이미지

음.. 수학적으로 공학에서 쓰는 난수는 의사난수로 알고 있습니다.

결론적으로 컴퓨터 상에서 어떤 짓(?)을 해도 완벽한 난수가 발생되지 않습니다.

eminency의 이미지

그냥 엔터 따닥 치는 수준 정도만 해결하면 된다면...-_-

다음과 같이 하세요.

#include        <iostream>
#include        <sys/time.h>

using namespace std;

int main()
{
        struct timeval t;

        gettimeofday(&t, NULL);
        srand(t.tv_usec);

        cout << rand() << endl;
} 

초단위가 아니라 마이크로초 단위로 seed를 주게 됩니다.

저래도 안된다면 프로그램을 그렇게 만들지 않으시는 것이 더 낫다고 생각합니다(실행단위 한 번으로 난수를 연속적으로 발생시키든지, 아니면 약간의 sleep을 발생시키든지, 이도저도 아니면 daemon으로 돌려서 클라이언트가 난수를 받아오게 하시든지...-_-).

컴퓨터가 발생하는 난수는 알고리즘에 의한 것이므로 진정한 난수가 될 수 없습니다. 그 점을 생각하세요...

노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5

익명 사용자의 이미지

난수는 필요한 목적에 의해 그 생성기를 만들기도 합니다. 특정 통계분포에 적절한 난수를 생성하는 라이브러리들이 존재하는 이유입니다. 때로 정규분포, Poison분포등에 해당되는 난수를 발생시키기도 하고(이경우에는 시뮬레이션이 목적이었다는..), 이는 프로그래머의 목적(제품의 목적)에 따라 틀려지게 될것입니다. 난수의 사용은 다양하지만, 시뮬레이션에서는 실제 그럴듯한 유형이 나와야 하기 때문입니다. 난수지만, 난수를 통계냈을때, 그럴듯한 분포를 말합니다.

완전한 난수를 발생시키기위한 노력들이 꾸준히 진행되고 있고, 리눅스 및 몇몇 플랫폼에서는 이를 운영체제에 디바이스를 제공하여 제시하기도 합니다(/dev/random) 표준 라이브러리 형태는 아니지만 보다 완벽한 난수제공을 위한 노력으로 봐야겠지요.

* 난수 발생기의 성능은 플랫폼별로 차이가 날 수 있고(미세한 시간이 요구되는 경우) 가급적 난수 발생기를 직접제작해서 사용하는게 좋습니다.

* 그중 한때 관심가졌었던 사이트가 기억에 남습니다.( http://sprng.cs.fsu.edu/ )
* 관련 키워드는 secure pseudo random nuber generator 정도로 볼 수 있겠습니다. secure가 질문자의 의도를 반영하는 얘기로 볼 수 있습니다. 여기서는 예측불가한 그런 의미로 봐야 할 것입니다.

익명 사용자의 이미지

암호쪽에서는 난수가 매우 중요한데 이때는 주로 매번 난수 생성시마다 새 random seed 값도 생성하고 파일에다가 저장합니다.
그리고 그 파일은 다른데서 읽지 못하도록 하여 난수의 예측 가능성을 없앱니다.
그리고 의사난수가 아닌 진짜 난수를 생성하는 하드웨어 랜덤넘버생성기도 있습니다.
인텔의 810, 815, 830, 845G 계열 칩셋에 달려 있다네요..

익명 사용자의 이미지

http://www.intel.com/design/embeddedpca/products/pxa270/techdocs.htm

말씀하신 부분은

http://www.intel.com/design/pca/applicationsprocessors/manuals/280000.htm

에서 pdf 를 받아서 "Memory Controller" (6장) 을 읽어 보시면 됩니다.

익명 사용자의 이미지

다른 글타래에 올릴 글 (인텔 PXA270) 을 잘못 올렸습니다.
로긴을 안해서 지울 수도 없는 것 같군요. 용서 바랍니다.

익명 사용자의 이미지

엔터 따닥 때릴 때 생기는 문제는 시스템에 글로벌한 시드 발생기를
이용해도 해결 될 것 같습니다. 매 번 읽을 때 마다 다른 값을 리턴
해 주는 기능을 이용하는 거지요. 아마 /dev/random 이나 /dev/urandom
같은 장치들이 그런 용도인걸로 알고 있습니다.

익명 사용자의 이미지

Anonymous wrote:
음.. 수학적으로 공학에서 쓰는 난수는 의사난수로 알고 있습니다.

결론적으로 컴퓨터 상에서 어떤 짓(?)을 해도 완벽한 난수가 발생되지 않습니다.

또 물론 완벽한 난수도 없을테구요!
생각해보면 완벽한 난수라는건 순전히 인간의 머리속에만 존재하는
추상체라는 생각이 드네요. 원처럼 말이죠.....

eminency의 이미지

Anonymous wrote:
Anonymous wrote:
음.. 수학적으로 공학에서 쓰는 난수는 의사난수로 알고 있습니다.

결론적으로 컴퓨터 상에서 어떤 짓(?)을 해도 완벽한 난수가 발생되지 않습니다.

또 물론 완벽한 난수도 없을테구요!
생각해보면 완벽한 난수라는건 순전히 인간의 머리속에만 존재하는
추상체라는 생각이 드네요. 원처럼 말이죠.....

그냥 재미로 쓰는 답글입니다만...
사람이 생각하는 난수도 완벽하진 않다고 하더군요. 1-10까지 중에 임의의 수를 계속 선택시키면 사람은 같은 수를 두 번 연속으로 말하지 않는 경향이 있다죠. 1/10의 확률인데 말이죠...;

결국 사람이나 기계나 완벽한 난수를 만들지 못하는거군요.
무리수의 존재만이 완벽한 난수? -_-;

(수학도 쥐뿔도 모르는데 이런 얘길 쓰다니 죄송스럽습니다...ㅡㅡ)

노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5

bopy의 이미지

srand()을 처음에 한번만 하시면 되지 않을까요?

Nothing is Everything.

익명 사용자의 이미지

pid값을 얻어온 후에 time값에 더하거나 곱해서 사용해보세요.

Necromancer의 이미지

보통 CPU 클럭카운트를 난수 소스로 많이 쓰죠.

Written By the Black Knight of Destruction

댓글 달기

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