mwultong Blog ... 프로그래밍 / 계산기

컴퓨터 엑셀 워드 포토샵 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
Wednesday, September 20, 2006

C언어] 랜덤(Random)하게 숫자(정수) 출력, srand(), rand(), randomize() - Visual C++


업데이트:
이 게시물의 소스에는 문제가 있습니다. 씨앗값을 1초 단위로 주었기 때문입니다.

수정 사항을
▶▶ C언어] 랜덤 숫자(정수) 출력 - Random Numbers rand srand 함수
이 게시물에 올렸습니다.

아래의 글은 참고 사항으로만 보시기 바랍니다.




볼랜드C++는 그렇지 않은데, 비주얼C++는 랜덤하게 숫자를 출력시키는 것이 아주 까다로웠습니다. 아무튼 다음의 방법으로 랜덤 정수들을 만들어 낼 수 있습니다.

이 랜덤 예제는, 제가 실무에 쓰기 위해 몇 년 전에 만든 것인데 아주 골치 아프더군요.

랜덤 함수 예제: foo.cpp


// 이 소스의 확장자를 .c 로 하면 에러가 납니다. 반드시 .cpp 여야 합니다.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void randomize(void); // 아래에 randomize()를 정의했다는 사실을 컴파일러에게 알려줌



void main(void) {
  randomize(); // 이것이 없으면, 실행할 때마다 항상 똑같은 랜덤 숫자들이 나옴

  // 1~100 까지의 숫자 30개를 랜덤하게 출력
  for (int i = 1; i <= 30; i++) printf("%d\n", rand() % 100 + 1);
}



void randomize(void) {
  srand((unsigned) time(NULL));
  // 첫부분의 숫자는 거의 랜덤하지 않기에, 앞부분에서 랜덤한 개수로 뽑아서 버림
  for (int i = 0; i < (rand() % RAND_MAX); i++) (rand() % RAND_MAX);
}


randomize() 함수는 랜덤 넘버 발생기 (Random Number Generator) 를 초기화시키는 것입니다. 이 함수를 호출하지 않으면 실행할 때마다 항상 똑같은 랜덤 숫자들이 나오게 됩니다. randomize() 함수는 볼랜드C/C++에 있는 함수인데, 비주얼C/C++에서도 간편히 쓸 수 있게, 같은 이름으로 직접 작성했습니다.

랜덤 넘버 발생기 (Random Number Generator) 를 초기화하는 일은 실제로는 srand() 가 합니다. srand() 속에 현재 시각인 time(NULL) 을 씨앗값으로 넣었습니다.


그리고

  for (int i = 0; i < (rand() % RAND_MAX); i++) (rand() % RAND_MAX);

이 부분이 설명하기 어려운 부분인데, 비주얼C++에서는, 랜덤 숫자를 여러 개 만들 때, 맨 첫번째 숫자는 거의 랜덤하지 않았습니다. 무작위로 나오지 않고 1~3씩 숫자가 증가만 했습니다. 왜 그런지는 모르겠습니다. 그래서 이 줄은 처음으로 만들어지는 랜덤 숫자들을 랜덤한 개수로 뽑아서 지워 버리는 일을 합니다. 이러니 랜덤한 숫자가 나오더군요. 이 방법이 제대로 된 방법은 아니겠지만 실무에 쓰기에는 무리가 없었습니다.

그러나 미션 크리티컬한 작업이라면, 자바를 쓰는 것이 나을 것 같았습니다. (▶▶ [자바/Java] 랜덤 정수/실수/불린 출력 예제 - Random, nextInt() 메소드 참고)

자바의 랜덤 함수(메소드)에는 이런 모호한 문제가 없었습니다.



실행 결과:
24
7
63
72
31
18
82
1
63
26
76
10
17
53
8
18
71
100
61
87
46
81
42
63
98
21
89
59
43
86



추가 사항:
위의 방법도 문제가 있군요. 위의 예제 프로그램을 1초에 한 번씩 실행시키면, 같은 숫자가 나옵니다-_-

씨앗값을 1초 단위로 주기 때문에 그런 것 같습니다.

--------
업데이트:
수정 사항을
▶▶ C언어] 랜덤 숫자(정수) 출력 - Random Numbers rand srand 함수
이 게시물에 올렸습니다. 천분의1초 단위로 씨앗값을 주었습니다.
--------



그런데 자바는 1초마다 실행해도 문제가 없었습니다.
Foo.java
import java.util.Random;

class Foo {
  public static void main(String args[]) {

    Random oRandom = new Random();

    for (int i = 1; i <= 30; i++)
      System.out.println(oRandom.nextInt(100) + 1);
  }
}



정수 난수 발생기: ▶▶ 난수 발생기; 랜덤 정수 생성, 무작위 숫자 발생; Random Int Number Generator




tag: cpp
C언어 | C/C++ (Visual C++)

0 Comments:

<< Home RSS 2.0 feed

구글 Google 에서 제공하는 무료 블로그 서비스인 블로거 Blogger 의 인터넷 주소는 www.blogger.com 입니다. Blogger 에 블로그를 만들면, blogspot.com 이라는 주소에 블로그가 생성됩니다.
블로그를 직접 방문하지 않고도 최신 게시물을 구독하려면 RSS 2.0 feed 주소를 리더기에 등록하시면 됩니다.
Previous Posts
Monthly Archives
Top