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

 
Previous Post 정규식] 대소문자 구분 없이 찾기, 매치 시키기; Regex Ignore Case Perl...Java/자바 에러] class Bar is public, should be declare...Perl/펄] 파일의 중복된 행 지우기; 같은 줄, 동일 값 제거, Remove Dupli...grep 명령] 찾은 문자열/단어 개수 출력, 행의 개수 출력: Count of Strin...Perl/펄] 파일 속의 문자열, 단어 개수 세기; Count All (grep 확장 스크...리눅스/유닉스에서 파일 찾는 방법; 디렉토리 찾는 법; File Find Command L...HTML] 아랍어, 오른쪽에서 왼쪽 방향으로 쓰기, 언어 속성 지정; Arabic Dire...HTML] 아랍어 인코딩; 아라비아어 웹페이지; Arabic Encoding charset...Java/자바] 배열 사이즈 구하기; 배열 크기 얻는 함수는? Array Size; siz...VIM (VI, GVIM) 텍스트 입력 시작, 편집(Edit) 명령어; 빔 에디터 기초 사...

C언어] 0.0 ~ 1.0 범위 실수 난수; 실수형 랜덤 생성; Random Double

Wednesday, November 29, 2006

다른 언어들의 랜덤 함수들은 대체로 0.0 ~ 1.0 범위의 실수를 리턴하는데,

C언어의 rand() 함수는 0 ~ 32767 까지의 정수(int)를 반환합니다.

정확하게 말하자면 0 ~ RAND_MAX 까지인데

비주얼C++의 경우 stdlib.h 헤더 파일에

#define RAND_MAX 0x7fff

이렇게 정의되어 있습니다. 16진수 0x7fff 는 10진수로 32767 이고

그래서 rand() 는 0 ~ 32767 까지의 난수가 출력됩니다.



다른 언어들의 경우처럼 실수 값을 반환하게 만들려면, 다음 예제에 있는

double randomDouble(void)

라는 함수를 사용하면 됩니다. 0.0 ~ 1.0 까지의 실수를 반환합니다.


VC++: 실수 난수 생성 예제


소스 파일명: 0.cpp
#include <stdio.h>
#include <stdlib.h>  // RAND_MAX
#include <Windows.h> // GetTickCount()

double randomDouble(void);


int main(void) {

  // 난수 발생기 초기화, 비주얼C++용
  srand(GetTickCount());


  // 0 ~ 32767 까지의 정수 난수 생성
  for (int i = 1; i <= 20; i++)
    printf("%d\n", rand());

/* 실행 결과:

21149
29586
18653
28590
22933
18816
22220
9712
26847
3756
4708
9493
23532
20825
12074
30618
25615
19220
22471
22426
*/




  // 0.00000000000000000 ~ 1.00000000000000000
  // 범위의 실수 난수 생성
  for (int i = 1; i <= 20; i++)
    printf("%.17f\n", randomDouble());

/* 실행 결과:

0.78749961851863159
0.71807000946073796
0.09689626758629108
0.27829828791161837
0.79158909878841521
0.54560991241187784
0.50291451765495776
0.16968291268654440
0.46308786278878139
0.47267067476424451
0.96151615955076752
0.88122196111941897
0.64656514175847657
0.22769859920041505
0.00064088869899594
0.18887905514694661
0.43452253791924800
0.77205725272377701
0.52006591998046814
0.54249702444532610
*/


  return 0;
}




double randomDouble(void) {
  return (double) rand() / RAND_MAX;
}



그런데 rand() 함수의 한계 때문에, 실수들이 고작 32768 개의 해상도(?)를 가지더군요. 즉, 0과 1사이에 32768 종류의 실수만이 존재했습니다.

그래서 소팅을 해보면, 같은 값의 실수들이 몇 개씩 중복되어 발견되는 문제가 남아 있습니다.



▶▶ C언어] 랜덤 숫자 (난수 정수) 출력 - Random Numbers rand srand 함수


0~1까지의 실수 난수 생성기: ▶▶ 0에서 1까지의 실수 난수 발생, 랜덤 생성; Float Random Maker

0 Comments:

Post a Comment

<< Home RSS 2.0 feed

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