Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- do it c
- C
- mysql
- C++
- 김성엽
- 유료강좌
- MyThread
- 핵심 요약
- 미가공
- 실습
- linux
- 포트폴리오
- MFC
- MFC 예제
- 별찍기
- C언어
- 정처기 독학
- Tipsware
- tips강좌
- Time
- 도움말
- 충무창업큐브
- MyTread
- 별찍기 기초
- SSG
- 정보처리기사
- win32
- ListBox
- mfc 실습
- 마이크로소프트
Archives
- Today
- Total
History
[c언어]중복없는 난수 생성하기 method_1 본문
728x90
반응형
일반적으로 난수를 생성하려면 time.h 헤더와 stdlib.h 헤더를 include 해줘야 한다.
#include<stdio.h>
#include<stdlib.h> //srand 함수를 사용하기 위해서
#include<time.h> //time 함수를 사용하기 위해서
int main()
{
int arr[16] = {}; //16개의 값을 담을 수 있는 배열 생성
srand((unsigned int)time(NULL)); //난수를 발생시키기 위해 난수 세팅
for (int i = 0; i < 15; i++){
arr[i]=rand() % 20; //0~19의 난수가 배열안에 대입
}
for (int i = 0; i < 15; i++){
printf("%d ", arr[i]); //출력
}
}
위와 같이 평범하게 난수를 발생시키면 위와 같이 중복 값이 들어온다. 그러면 이 중복 값을 들어오지 않게 하려면 어떻게 하면 될까?
아래 코드를 보자
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int arr[16] = {}; //배열 초기화
int temp,count=0; //난수를 대입할 tmep와 count 변수
bool flag = false; //플레그 변수
srand((unsigned int)time(NULL)); //난수 설정
for (int i = 0; i < 15; i++){
temp= rand() % 16; //0~15의 난수 발생
for (int j = 0; j < count&&i!=0; j++){ //i는 0이면 안된다.
if (temp == arr[j]){ //난수와 arr의 들어간 값 전부 탐색 만약 같은 숫자가 있으면
flag = true; //플레그 true
break; //반복문 탈출
}
}
if (flag){ //플레그에 들어왔으면
flag = false; //다시 플레그 false설정
i--; //반복문 i--
continue;
}
arr[i] = temp; //만약 위에 조건문들에 다 안들어왔으면 변수 대입
count++; //count++
}
for (int i = 0; i < 15; i++){ //출력 반복문
printf("%d ", arr[i]);
}
}
위와 같이 코드를 구성하면 실행화면은 0~15 사이의 숫자로 구성되어야 하고 중복은 없어야 한다.
위 사진처럼 중복 없는 난수의 값이 배열에 잘 들어갔다. 보기 불편하니 정렬 코드를 넣어서 제대로 한번 더 확인해보겠다.
제대로 들어간 것을 확인할 수 있다. 아래는 간단하게 선택 정렬까지 넣은 코드이다.
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int arr[16] = {};
int temp,count=0;
bool flag = false;
srand((unsigned int)time(NULL));
for (int i = 0; i < 15; i++){
temp= rand() % 20;
for (int j = 0; j < count && i != 0; j++){
if (temp == arr[j]){
flag = true;
break;
}
}
if (flag){
flag = false;
i--;
continue;
}
arr[i] = temp;
count++;
}
int temp2;
for (int i = 0; i < 15; i++) {
for (int j = i; j < 15; j++) {
if (arr[i] > arr[j]) {
temp2 = arr[i];
arr[i] = arr[j];
arr[j] = temp2;
}
}
}
for (int i = 0; i < 15; i++){
printf("%d ", arr[i]);
}
}
난수의 값을 바꿔서 실행해봐도 중복은 없었다.
728x90
반응형
'C,C++ > 개념 실습 프로그래밍' 카테고리의 다른 글
[c언어]getchar()함수로 문자열 입력받기 (0) | 2022.10.03 |
---|---|
[c언어]중복없는 난수 생성하기 method_2 (0) | 2022.09.25 |
[c언어]구조체 내부의 특정 변수만 복사하기 (2) | 2022.09.25 |
[c언어]현재 시간을 출력하려면 어떻게 해야할까? (0) | 2022.09.21 |
문자열에 포함된 숫자를 문자로 변경하기 (0) | 2022.09.21 |
Comments