메뉴 닫기

Random 난수 발생에 대한 검토

컴퓨터 과학 분야에서 말하는 난수는 보통 결정론적인 방법으로 생성된 난수이다.
특정 입력이나 조건에 따라 무작위로 선택된 것처럼 보이는 난수또는 난수열이 생성되며 그 생성 조건이나 입력이 같다면 그 결과값은 항상 같다.
진정한 의미에서의 난수는 아니지만 그 결과값이 충분히 추측되기 어렵다면 어느정도 난수로서의 의미를 가질 수 있다.
컴퓨터에 의해 생성된 모든 난수는 의사(擬似) 난수이다.
컴퓨터는 계산된 결과만 가지고 난수를 생성할 수 있는데 이 계산된 결과는 입력값에 의해 결정된 값이기 때문에 이 값을 가지고는 난수를 생성할 수 없다.
컴퓨터의 최초 시동시 난수표가 생성되어 컴퓨터내에 보관된다.
하지만 컴퓨터 프로그래밍에서 매번 같은 방법으로 이 값을 가지고 오려고 한다면 매번 그 값은 같기 때문에 최초 한번 호출할 때를 제외하고는 난수라고 볼 수 없다.
그래서 보통 씨앗 값(Seed)이라 불리는 수를 인자로 매번 다르게 주어 매번 다른 의사난수를 추출하여 사용한다. 이 씨앗 값은 보통 시간을 이용한다.
여기서 시간은 보통 현재 시간을 의미한다. 매 순간 현재시간이 바뀌며 한 번 지나간 시간은 다시 돌아오지 않는다는 특성은 이전에 발생했던 의사난수 또는 의사난수열을 재연 불가능하게 만들며, 이 시간이 밀리초 단위로 섬세하게 표현된다면 사람에의한 임의적 조작도 사실상 불가능해진다.


C++의 Rand
rand는 난수를 만드는 함수이며, stdlib.h 파일을 포함시켜야 한다.
rand() 는 0부터 stdlib.h 파일에서 지정되있는 0x7fff까지의 범위를 가진 난수(임의의수)를 출력한다.
0x7fff는 32767이니까 0~32767의 범위 사이에서 난수가 생성된다는 말이다.
임의의 값을 추출한다는 의미가 같은 값이 중복되지 않는 다는 의미는 아니다.
실제로 Rand()를 반복해서 실행시켜 보면 값이 순서대로 나열되지는 않지만 계속 동일한 결과가 반복되는 것을 볼 수 있을 것이다.
앞에서 설 명했듯이 최초한번만 난수가 생성되었다고 하더라도, 다음에도 같은 결과가 반복된다면 난수는 의미가 없다.
그래서 Seed값을 주어서 매번 다른 값을 출력하게 한다. 즉 srand(time(NULL)); 와 같은 코드를 추가하여 매번 다른 값을 출력 하게 한다.

#include
#include
#include
int main()
{
int i;
srand(time(NULL));
for(i=0; i<10; i++)
printf("%d ", rand()%10);
printf("\n")
return 0;
}

C++ Random  범위지정 :대부분의 프로그램에서 우리는 0~32767의 난수를 모두 사용하지 않으므로 Random함수의 출력 범위를 설정하여 사용한다.
그러기 위해 “%” 연산자를 사용한다.   나눗셈을 하여 몫만 취하게 한다는 것이다.
위의 소스 코드는 10으로 나누었기 때문에 결과는 0~9 사이의 값만이 존재한다.
rand()%10+1 과 같이 코딩하면 1~10 사이의 값이 항상 출력 될 것이다.


C# Random
C#의 경우 srand와 같이 Seed를 사용할 필요가 없다고 하는데 글쎄 바람직 하지는 않은것 같다.
C# 과 JAVA는 rand함수가 따로 있는 것이 아니라 Class로 구현되어 있어서
아래예와 같이 사용 할 수 있다, 또한 난수 발생범위를 지정 할 수 있다.

int i;
Random r = new Random();
//RandomRandom rand = new Random(DateTime.Now.Millisecond);
for (i = 0; i < 10; i++)
{
   Console.WriteLine("{0} = {1}", i + 1, r.Next(1, 100));//1~100 까기의 난수 발생
}

난수 발생시 중복 방지하기
Random을 사용하여 생성되는 값을 범위를 임의로 제한 했으므로 범위안에서는 중복된 값이 있을 수 있다.
그러므로 중복된 값에 대한 처리가 필요하다.
로또 번호 생성과 같은 경우  6개의 배열을 만들고 같은 번호가 중복되면 무시하고 한번 더 난수를 발생시켜 저장하는 방식으로 중복없는 값을 추출할 수 있다.

#include
#include
#include
int main()
{
       int rn=0;
       int a[6];
       int i, j;
       srand((unsigned int)time(NULL));
       for ( i = 0; i < 6; ++i )
       {
           rn= rand() % 45+ 1;
           for ( j = 0; j < i; ++j )
           {
              if ( a[j] == rn )// 같은값이 이미있으므로
              {
                  --i;   //인덱스를 증가 하지 않고 For(i = 문을 한번 더 실행해서 새로윤 난수 생생시킴
                  break;
              }
           }
           a[i]=rn ;
       }
}

35 Comments

  1. g no

    After I initially left a comment I appear to have clicked the -Notify
    me when new comments are added- checkbox and now whenever a comment is added I receive 4 emails with the exact same comment.
    Is there a way you can remove me from that service? Many thanks!

  2. very g

    Attractive section of content. I simply stumbled upon your
    site and in accession capital to claim that I acquire actually loved account your weblog
    posts. Any way I will be subscribing to your augment or even I achievement you get right of entry to constantly quickly.

  3. g day

    When I initially commented I clicked the “Notify me when new comments are added” checkbox and now each time a comment is added I
    get three e-mails with the same comment.
    Is there any way you can remove people from that service?
    Cheers!

  4. viagra online buy

    I?m satisfied, I should say. Actually rarely do I experience a blog site that?s both instructional and also amusing, and let me tell you, you have actually hit the nail on the head. Your concept is outstanding; the problem is something that not enough individuals are talking wisely around. I am really happy that I came across this in my search for something relating to this.

  5. security screens sliding doors

    Woah! I’m really digging the template/theme of this website. It’s simple, yet effective. A lot of times it’s tough to get that “perfect balance” between usability and visual appearance. I must say that you’ve done a excellent job with this. In addition, the blog loads super fast for me on Opera. Excellent Blog!

  6. metal screen doors

    I don’t know if it’s just me or if everyone else experiencing issues with your blog. It looks like some of the written text on your posts are running off the screen. Can somebody else please comment and let me know if this is happening to them as well? This may be a issue with my browser because I’ve had this happen before. Many thanks

  7. buy acdc cbd whole plant extract sale

    Youre so great! I do not expect Ive check out anything similar to this before. So good to locate someone with some original ideas on this subject. realy thanks for starting this up. this site is something that is required on the internet, someone with a little originality. beneficial task for bringing something new to the net!

  8. click this

    Good post. I discover something a lot more tough on different blog sites daily. It will always be boosting to review web content from various other authors as well as practice a something from their store. I?d favor to make use of some with the content on my blog site whether you don?t mind. Natually I?ll offer you a web link on your web blog. Thanks for sharing.

  9. web site

    This web site is really a walk-through for every one of the information you wanted regarding this and also didn?t recognize that to ask. Look right here, and also you?ll definitely discover it.

  10. go to this website

    A remarkable share, I just provided this onto an associate who was doing a little evaluation on this. And also he in fact purchased me morning meal since I located it for him. smile. So let me reword that: Thnx for the reward! However yeah Thnkx for investing the moment to review this, I feel strongly concerning it and also love reading more on this subject. If possible, as you come to be competence, would you mind upgrading your blog site with even more information? It is extremely helpful for me. Huge thumb up for this article!

  11. next

    There are some fascinating times in this post but I don?t understand if I see all of them center to heart. There is some credibility however I will hold viewpoint until I check out it even more. Good write-up, many thanks and we desire more! Added to FeedBurner as well

  12. see here

    There are definitely a great deal of information like that to take into consideration. That is a great point to bring up. I use the thoughts over as general ideas yet clearly there are questions like the one you bring up where the most crucial thing will be working in sincere good faith. I don?t know if finest techniques have actually arised around points like that, but I make certain that your task is clearly recognized as a fair game. Both young boys as well as women feel the impact of just a moment?s pleasure, for the rest of their lives.

  13. get more information

    I?m impressed, I need to say. Truly rarely do I encounter a blog that?s both enlightening and also enjoyable, as well as let me inform you, you have struck the nail on the head. Your concept is outstanding; the issue is something that not enough individuals are talking smartly around. I am extremely satisfied that I stumbled across this in my look for something associating with this.

  14. Link

    There are some interesting points in time in this short article yet I don?t recognize if I see every one of them center to heart. There is some legitimacy however I will certainly hold opinion up until I look into it even more. Good post, thanks and also we desire a lot more! Included in FeedBurner as well

댓글 남기기

이메일은 공개되지 않습니다.