'난수'에 해당되는 글 2건

  1. 2018.09.24 파이썬 난수(random) 생성
  2. 2018.09.06 C 랜덤 - 난수 생성하기 7


안녕하세요 열코입니다.


이번시간에는 파이썬의 랜덤(난수) 클래스에 대해 알아보도록 하겠습니다.

파이썬에서 난수를 생성하기 위해서는 random 모듈을 사용합니다.

프로그래밍을 하면 난수를 생성해야하는 일이 많이 생기는데요. 

이때 random 모듈을 사용하시면 됩니다.


사용법은 간단합니다.

여러가지 상황에 따라 코드로 설명하겠습니다.


① 1부터 10까지 난수 생성

import random

num = random.randrange(1, 11) # 1부터 10 사이의 난수 생성

num2 = random.randrange(1, 11, 2# 1부터 10 사이의 난수(홀수) 생성

print(num) 

print(num2)


random 모듈을 import 해서 추가하고, random.randrange() 함수를 사용하여 간단하게 

난수를 생성할 수 있습니다.

random.randrange() 함수의 매개변수는 첫번째 시작 숫자, 두번째 끝 숫자 + 1입니다.

- 1부터 10까지의 난수를 생성하고자 하면 1, 11을 입력하면 됩니다.

- 5부터 25까지의 난수를 생성하고자 하면 5, 26을 입력하면 됩니다.



세번째 매개변수는 난수들 사이의 간격인데 1부터 10까지 숫자중 2씩 간격을 두면

모두 홀수만 출력되겠죠? 만약 짝수만 출력되게 하고 싶으면 첫번째 매개변수를 짝수로 주면 됩니다.


만약 랜덤 소수가 필요하신 분은 아래와 같이 사용하시면 됩니다.

import random

num = random.random() # 0과 1사이의 임의의 소수

print(num) # 0.8003784774477363 출력


위 코드와 같이 random.random() 함수를 그냥 호출하면 0과 1사이의 임의의 소수가 출력됩니다.

소수점을 제한해서 출력하고 싶으면 print(round(num, 2)) 이렇게 사용하시면 됩니다.


② 이미 정의된 리스트형 자료 섞기(셔플)

import random

myList = [ 1, 2, 3, 4, 5 ]

random.shuffle(myList) # 순서 섞기 (셔플)

print(myList) # [5, 2, 1, 3, 4] 출력


난수를 생성해서 리스트로 만드는 방법도 있겠지만 이미 생성된 리스트가 존재하는 경우?

해당 리스트를 마구잡이로 섞어버리는 함수가 있습니다.

바로 shuffle() 이라는 함수인데요. 대충 보셔도 아시겠지만 셔플은 카드 게임에서도 섞는것을 의미하죠?

random.shuffle() 함수에 리스트를 매개변수로 호출하면 리스트가 뒤죽박죽으로 순서가 바뀝니다.


③ 랜덤으로 하나 선택(초이스)

import random

menu = [ '김치찌개', '된장찌개', '치킨', '피자', '햄버거', '카레', '김밥', '족발', '보쌈', '라면', '초밥',

 '돈까스', '파스타', '닭발', '우동', '오돌뼈', '떡볶이']

dinner = random.choice(menu) # 랜덤으로 하나 선택

print(dinner)


점심 또는 저녁메뉴로 뭘 먹어야 할지 매번 고민인 당신에게

파이썬 random 모듈이 오늘의 식사 메뉴를 직접 선택해주는 프로그램을 만들어보았습니다.

random.choice() 함수는 매개변수로 입력된 리스트 중 랜덤으로 하나를 선택해주는 함수입니다.

menu의 리스트에 메뉴를 더 추가하시고 직접 저녁메뉴를 골라보세요!



④ 랜덤 문자열 생성

또한 문자열 중 랜덤으로 문자를 추출해 랜덤 문자열(임의의 문자열)을 만들어서 

비밀번호 또는 코드로 사용할 수 있습니다.

import random

import string

pw = "".join([random.choice(string.ascii_uppercase) for _ in range(10)]) # 대문자

pw1 = "".join([random.choice(string.ascii_lowercase) for _ in range(10)]) # 소문자

pw2 = "".join([random.choice(string.ascii_letters) for _ in range(10)]) # 섞어서

print(pw) # BAISKPLYXR 출력

print(pw1) # rhgopkcbew 출력

print(pw2) # fdUFmexRKU 출력


⑤ 중복 되지 않는 난수 생성

난수를 생성하여 사용하다보면 중복되는 숫자들이 많은데, 이를 해결하기 위해 간단한 코드를 

삽입하여 해결 가능합니다.

import random


myList = []

num = random.randrange(0, 10)


for i in range(10) :

    while num in myList : # 중복될 경우

        num = random.randrange(0, 10) # 다시 난수 생성

    myList.append(num) # 중복 되지 않은 경우만 추가


# myList.sort() # 정렬이 필요하다면

print(myList)




이상 '파이썬 난수 생성'에 대해 알아보았습니다.

질문 또는 오타나 잘못된 정보가 있는 경우 댓글로 달아주세요!

공감♡ 버튼을 눌러주시면 더욱 유용하고 좋은 포스팅으로 찾아 뵙겠습니다.





C언어 프로그래밍에서 코드를 작성하다보면 무작위의 숫자가 필요한 경우가 존재합니다.

보통 무작위 숫자를 난수라고 표현합니다.

C언어에서 난수를 표현하기 위해서는 라이브러리를 사용해야합니다.


※ 알고가기

라이브러리란 자주 사용하는 함수들을 미리 작성하여 저장해둔 파일로써 보통 헤더파일로 저장됩니다.

이 헤더파일은 #include 라는 코드를 통해 추가해 줄 수 있는데

C언어에서 기본적으로 사용하는 헤더파일은 stdio.h 이며 이는 Standard Input Ouput(표준 입출력)의 약자입니다.

사용방법은 프로그램 코드 맨 윗줄에 #include <헤더파일명.h> 또는 "헤더파일명.h" 으로 사용할 수 있습니다.

보통 < > 는 Standard Library Header에서 사용하며 " "는 User Defined Header를 사용할 때 쓰는것이라 알려져있는데 크게 틀린말은 아닙니다.

< >와 " "의 차이는

- < > : 컴파일러가 미리 정해놓은 위치에서 헤더파일을 찾습니다.

- " " : 컴파일러가 미리 정해놓은 위치에서 헤더파일을 찾고 만약 찾지 못한다면, < >로 바꾸어 헤더파일을 찾습니다.

로 생각하면 되겠습니다. 결국 Header파일을 읽은 것인지 Source파일을 읽을 것인지에 따라 사용을 구분하면 되겠습니다.


다시 본론으로 와서, C언어에서 난수를 만들기위해서는 rand()라는 함수를 사용하면 됩니다.

rand()함수는 stdlib.h 헤더파일에 포함되어있기 때문에 코드 맨 윗줄에 #include <stdlib.h>를 작성해 줍니다.


☞ rand()함수 사용법

#include <stdio.h>

#include <stdlib.h> // rand() 함수 포함 라이브러리


int main()

{

int random = 0; // 정수형 변수 선언

for (int i = 0; i < 10; i++) { // 10번 반복

random = rand()%9; // 난수 생성

printf("%d\n", random); // 출력

}

}


☞ 실행결과


8번째 줄을 보시면 random = rand()%9; 라는 코드가 있습니다.

해석하면 rand() 함수에 의해 난수를 생성하고 그 숫자를 9로 나눈 나머지를 random 변수에 대입하는 코드입니다.


※ 알고가기

rand() 함수에 의해 생성되는 난수 : 0 ~ 32767


rand() 함수에 의해 생성된 난수를 9로 나눈 나머지(%)의 값은 0부터 8까지입니다.

이를 1부터 9까지 난수를 생성하고 싶을때는 다음과 같이 8번째 줄 코드를 변경합니다.


random = rand()%9 + 1;


이는 0부터 8까지 반환되는 난수에 1을 더해줌으로써 1부터 9까지 반환할 수 있도록 하는 코드입니다.


하지만 여기서 문제점이 발생합니다.

분명 개발자가 원하는 난수를 생성하고 출력했지만 그 패턴(규칙)이 매번 일정하다는 겁니다.



다시말해, 프로그램 실행 시(또는 반복문) 항상 같은 난수가 생성된다는 겁니다.

이는 진정한 난수라고 말할 수 없죠.

그렇다면 프로그램 실행 시 매번 다르게 난수를 생성하는 방법은 무엇일까요?


그건 바로 srand()라는 함수를 사용하면 됩니다!

rand() 함수를 사용하기 전에 다음과 같은 코드를 추가합니다.


srand(time(NULL));


무슨뜻이냐면 srand()함수는 rand()라는 함수에 무작위의 시드값을 주기위한 함수이며 그 파라미터로 time(NULL)이라는 매개변수를 전달합니다.

time(NULL)은 1970년 1월 1일 이후 경과된 시간을 초 단위로 반환하는 함수입니다.

이로써 1초 단위로 매번 다른 시드값을 생성해 rand()함수를 호출하는 것입니다.

이해가 안가시는분은 그냥 이걸 써야 진정한 난수가 생성되는구나! 라고 생각하시면 됩니다.

물론 time()함수를 사용하기 위해서 #include <time.h>를 추가해주시는걸 잊지마세요!


☞ 진정한 난수 생성코드

#include <stdio.h>

#include <stdlib.h> // rand()함수 포함 라이브러리

#include <time.h> // time()함수 포함 라이브러리


int main()

{

srand(time(NULL)); // 매번 다른 시드값 생성

int random = 0; // 정수형 변수 선언

for (int i = 0; i < 10; i++) { // 10번 반복

random = rand()%9; // 난수 생성

printf("%d\n", random); // 출력

}

}


☞ 실행결과


3번 실행 한 결과 모두 다른 난수값이 생성되는것을 확인 할 수 있습니다!

이로써 진정한 난수 생성하는 방법 및 코드에 대해 알아보았습니다.





정보가 유익하셨다면 아래 공감버튼 눌러주시면 감사하겠습니다.

질문사항은 댓글로 달아주시면 성의껏 답변해드리겠습니다.



'C, C++' 카테고리의 다른 글

C/C++ 구조체 사용법 및 예제  (1) 2018.10.08
C/C++ 배열 사용법  (0) 2018.10.05
C 파일처리  (0) 2018.10.02
C++ 벡터 사용법  (2) 2018.09.26
C언어 포인터  (8) 2018.09.25
C++ 자바 상속 비교  (0) 2018.09.08
C++ String 문자열 사용법 정리  (0) 2018.08.20
[C++] C# 연동하기 / C# dll 파일 만들기  (1) 2018.08.18

to Top