Wednesday, September 20, 2006
C언어] 랜덤(Random)하게 숫자(정수) 출력, srand(), rand(), randomize() - Visual C++
업데이트:
이 게시물의 소스에는 문제가 있습니다. 씨앗값을 1초 단위로 주었기 때문입니다.
수정 사항을
▶▶ C언어] 랜덤 숫자(정수) 출력 - Random Numbers rand srand 함수
이 게시물에 올렸습니다.
아래의 글은 참고 사항으로만 보시기 바랍니다.
볼랜드C++는 그렇지 않은데, 비주얼C++는 랜덤하게 숫자를 출력시키는 것이 아주 까다로웠습니다. 아무튼 다음의 방법으로 랜덤 정수들을 만들어 낼 수 있습니다.
이 랜덤 예제는, 제가 실무에 쓰기 위해 몇 년 전에 만든 것인데 아주 골치 아프더군요.
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() 메소드 참고)
자바의 랜덤 함수(메소드)에는 이런 모호한 문제가 없었습니다.
실행 결과:
추가 사항:
위의 방법도 문제가 있군요. 위의 예제 프로그램을 1초에 한 번씩 실행시키면, 같은 숫자가 나옵니다-_-
씨앗값을 1초 단위로 주기 때문에 그런 것 같습니다.
--------
업데이트:
수정 사항을
▶▶ C언어] 랜덤 숫자(정수) 출력 - Random Numbers rand srand 함수
이 게시물에 올렸습니다. 천분의1초 단위로 씨앗값을 주었습니다.
--------
그런데 자바는 1초마다 실행해도 문제가 없었습니다.
Foo.java
정수 난수 발생기: ▶▶ 난수 발생기; 랜덤 정수 생성, 무작위 숫자 발생; Random Int Number Generator
이 게시물의 소스에는 문제가 있습니다. 씨앗값을 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);
}
#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
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);
}
}
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++)
<< Home