C 언어 난수 생 성 튜 토리 얼(rand 와 srand 용법)

4476 단어 C 언어난수
실제 프로 그래 밍 에서 우 리 는 항상 랜 덤 수 를 생 성 해 야 한다.예 를 들 어 뱀 을 탐식 하 는 게임 에서 랜 덤 으로 음식 이 나 오고 카드 게임 에서 랜 덤 으로 카드 를 낸다.
C 언어 에서 우 리 는 일반적으로헤더 파일 의 rand()함 수 를 사용 하여 무 작위 수 를 생 성 합 니 다.그 용법 은 다음 과 같 습 니 다.

int rand (void);
void 는 매개 변 수 를 전달 할 필요 가 없다 고 표시 합 니 다.
C 언어 에는 랜 덤 수 를 얻 을 수 있 는 random()함수 가 하나 더 있 지만 random()은 표준 함수 가 아니 라 VC/VS 등 컴 파 일 러 를 통과 할 수 없 기 때문에 비교적 적 게 사용한다.
rand()는 0~RAND 에 무 작위 로 생 성 됩 니 다.맥 스 사이 의 정수.
RAND_MAX 는헤더 파일 의 매크로 입 니 다.rand()가 되 돌 릴 수 있 는 난수 의 최대 값 을 가리 키 는 데 사 용 됩 니 다.C 언어 표준 은 RAND 를 규정 하지 않 았 습 니 다.MAX 의 구체 적 인 수 치 는 단지 그것 의 수 치 를 적어도 32767 로 규정 할 뿐이다.실제 프로 그래 밍 에서 도 우 리 는 RAND 를 알 필요 가 없다.MAX 의 구체 적 인 값 은 그것 을 큰 숫자 로 취급 하면 된다.
다음은 난수 생 성의 실례 입 니 다.

#include <stdio.h>
#include <stdlib.h>
int main(){
  int a = rand();
  printf("%d
",a); return 0; }
실행 결과 예:
193
난수 의 본질
위의 코드 를 여러 번 실행 하면 매번 발생 하 는 난수 가 똑 같은 것 을 발견 할 수 있 습 니 다.어떻게 된 일 입 니까?왜 랜 덤 수가 랜 덤 이 아 닙 니까?
실제로 rand()함수 가 발생 하 는 임 의 수 는 위 임 의 수 이 고 하나의 수치 에 따라 특정한 공식 에 따라 계산 한 것 이다.이 수 치 를 우 리 는'씨앗'이 라 고 부른다.피 드 와 난수 간 의 관 계 는 정상 적 인 분포 로 다음 그림 과 같다.

C 언어 임 의 수 와 피 드 간 에 정상 적 인 분 포 를 나타 낸다.
피 드 는 컴퓨터 를 시작 할 때마다 무 작위 이지 만 컴퓨터 가 시작 되면 변 하지 않 습 니 다.컴퓨터 를 시작 할 때마다 피 드 는 값 을 정 하기 때문에 공식 에 따라 추 산 된 결과(즉 생 성 된 난수)는 고정 적 인 것 이다.
다시 파종 한다
우 리 는 srand()함 수 를 통 해 씨앗 을 다시 파종 할 수 있다.그러면 씨앗 이 바 뀔 것 이다.srand()의 용법 은:

void srand (unsigned int seed);
unsigned int 형식의 인자 가 필요 합 니 다.실제 개발 에서 우 리 는 시간 을 매개 변수 로 할 수 있다.매번 파종 하 는 시간 이 다 르 면 생 성 된 씨앗 이 다 르 고 최종 난수 도 다르다.
헤더 파일 의 time()함 수 를 사용 하면 현재 시간(초 까지 정확)을 얻 을 수 있 습 니 다.아래 와 같이:

srand((unsigned)time(NULL));
관심 있 는 독 자 는여 기 를 강 타 하 다스스로 time()함수 의 용법 을 연구 하 세 요.이 절 에서 우 리 는 더 이상 설명 하지 않 겠 습 니 다.
위의 코드 를 수정 하고 무 작위 수 를 만 들 기 전에 먼저 파종 합 니 다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
  int a;
  srand((unsigned)time(NULL));
  a = rand();
  printf("%d
", a); return 0; }
프로그램 을 여러 번 실행 하면 매번 생 성 되 는 난수 가 다르다 는 것 을 알 수 있다.그러나 이런 랜 덤 수 는 점점 커지 거나 점점 줄 어드 는 추 세 를 보일 것 이다.이것 은 우리 가 시간 을 씨앗 으로 하고 시간 이 점점 커지 기 때문이다.위의 정상 분포 도 를 결합 하면 랜 덤 수도 점점 커지 거나 줄 어 들 것 이 라 고 추측 하기 쉽다.
일정 범위 내의 난수 생 성
실제 개발 에서 우 리 는 일정한 범위 내의 랜 덤 수가 필요 하 다.너무 크 거나 너무 작 아 도 요구 에 부합 되 지 않 는 다.그러면 어떻게 일정한 범위 의 랜 덤 수가 생 길 수 있 습 니까?우 리 는 모델 링 방법 을 이용 할 수 있다.

int a = rand() % 10;  //  0~9    ,  10    
상하 한 을 정 하려 면:

int a = rand() % 51 + 13;  //  13~63    
분석:모델 링 을 하면 나머지 를 얻 을 수 있 습 니 다.rand()%51+13 우 리 는 두 부분 으로 볼 수 있 습 니 다.rand()%51 은 0~50 의 랜 덤 수 를 만 들 고 뒤에+13 보증 a 는 최소 13 만 있 으 며 최대 50+13=63 입 니 다.
마지막 으로 13~63 범위 내 무 작위 수 를 만 드 는 전체 코드 를 드 립 니 다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
  int a;
  srand((unsigned)time(NULL));
  a = rand() % 51 + 13;
  printf("%d
",a); return 0; }
연속 생 성 난수
때때로 우 리 는 한 조 의 난수(여러 개의 난수)가 필요 하 다.어떻게 생 성 해 야 합 니까?쉽게 생각 할 수 있 는 해결 방안 은 순환 을 사용 하고 매번 순환 할 때마다 다시 파종 하 는 것 입 니 다.아래 의 코드 를 보십시오.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
  int a, i;
  //  for    10    
  for (i = 0; i < 10; i++) {
    srand((unsigned)time(NULL));
    a = rand();
    printf("%d ", a);
  }
  return 0;
}
실행 결과 예:
8 8 8 8 8 8 8 8 8 8
운행 결 과 는 매우 이상 하 다.매번 순환 할 때마다 우 리 는 다시 파종 을 하 는데,왜 생 성 된 난수 가 모두 같 습 니까?
이것 은 for 순환 운행 속도 가 매우 빨 라 서 1 초 안에 운행 이 완성 되 었 고 time()함수 가 얻 은 시간 은 초 까지 만 정확 할 수 있 기 때문에 매번 순환 할 때마다 얻 는 시간 은 똑 같 습 니 다.그러면 피 드 는 똑 같 고 임 의 수도 똑 같 습 니 다.
그렇다면 어떻게 해결 해 야 할 까?랜 덤 수 를 연속 으로 생 성 할 방법 이 없 나 요?물론 있 습 니 다.우 리 는 1 절 에서 교묘 한 해결 방안 을 제시 할 것 입 니 다.
C 언어 난수 생 성 튜 토리 얼(rand 와 srand 용법)에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 C 언어 난수 생 성 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기