파이썬/파이썬(python) 초급

[4-1 파이썬] Randomisation 랜덤, random, seed(), randrange(), randint(), random(), uniform(), shuffle(), choice(), sample()

Olivia-BlackCherry 2022. 8. 9. 09:16
randomisitic 무작위적  vs  deterministic 결정적

이 두 단어를 비교해보자.

'무작위적'의 뜻은 예측할 수 없는, 자동으로 결정된 등으로

'결정적'의 뜻은 예측 가능한 방식으로 해석할 수 있다.

 

우리 주변에서도 랜덤방식을 적용한 것들이 많다. 

테트리스 게임을 할 때 블록이 하늘에서 내려오는데, 그 모양들이 랜덤이다.

친구와 가위바위보를 하는데, 친구가 내는 모양 역시 랜덤이다. 

비눗방울을 만들 때, 생기는 비눗방울들의 크기 역시 랜덤이다.

 

프로그래밍에서도 랜덤의 성질은 매우 유용하게 쓰인다.

 오늘은 '랜덤'의 성질을 적용된 프로그래밍을 해보도록 하겠다.

 

1. 컴퓨터에서 난수를 발생시키는 원리

컴퓨터는 0, 1로 이루어진 2진수로 작동되는 기계이다. 컴퓨터를 작동시키는 원리는 랜덤하기 보다는 determistic 결정적이다. 

이런 컴퓨터에서 난수를 발생시키는 방법에 관한 좋은 영상이 있어 추천한다.

https://www.khanacademy.org/computing/computer-science/cryptography/crypt/v/random-vs-pseudorandom-number-generators

 

Pseudorandom number generators (video) | Khan Academy

Random vs. Pseudorandom Number Generators

www.khanacademy.org

 

 

 2. 파이썬 모듈로 간단하게 난수 생성하기

위의 영상처럼 난수 생성을 할 수는 없다..! 너무 복잡하고, 우리가 할 수 없는 영역이다. 

하지만 파이썬 모듈을 이용하여 난수를 생성하는 것은, 초등학생도 할 수 있다!

유사 난수를 생성하기 위한 복잡한 수식은 필요없다.모듈을 이용하면 되고,

 

아래의 코드만 작성해주면 된다!

import random

import: 불러오다

random: 랜덤

 

모듈이란?

길거나 복잡한 코드를 매 페이지에 모두 적는 것은 비효율적이다.이해하기도 어렵고, 시간도 오래 걸린다. 하지만 코드를 개별 모듈로 나누어 필요한 기능을 작성해두고, 필요할 때 불러올 수 있다면 매우 효율적이다.

 

마치 협업을 하는 것과 똑같다. 자르는 사람, 붙이는 사람, 색칠하는 사람, 그림을 그리는 사람, 조각하는 사람 등으로 기능을 나누고

 

이번에 바다꾸미기를 한다면 색칠하는 사람, 그림을 그리는 사람을 데려와 사용하는 것이다. 

 

모듈도 똑같다. 랜덤 모듈안에 수많은 랜덤함수들이 있는데,거기에서 내가 필요한 함수를 가져와 쓰는 것이다.

 

오늘은 많이 쓰이는 랜덤 모듈의 함수 몇 가지를 소개한다. 

 

 

3. 정수 난수 발생시키기

- 범위 정해주기: random. randrange(start, stop, step)  

Returns a randomly selected integer from range(start, stop, step). This raises a ValueError if start > stop.

앞에 모듈을 붙여주고 randrange()함수를 적은 다음

괄호 안에 인수로

(시작, 끝, 간격)을 적는다. 

- a, b 두 수 사이의 정수 뽑기:random. randint(a, b)

Returns a random integer between a and b (both inclusive). This also raises a ValueError if a > b.

a, b를 포함하여, 두 정수 사이의 아무 숫자나 하나 뽑는다.

 

4. 실수 난수 발생시키기

- 0,1 사이의 실수 뽑기: random()

Returns the next random floating point number between [0.0 to 1.0)

0<= 실수 <1 이기에

1은 포함되지 않는다는 것을 주의하자.

 

- a, b 사이의 실수 뽑기: uniform(a,b)

Returns a random floating point N such that a <= N <= b if a <= b and b <= N <= a if b < a.

 

5. 더 많은 랜덤 모듈

-x를 랜덤하게 섞기: random.shuffle(x)

This is used to shuffle the sequence in place. A sequence can be any list/tuple containing elements.

리스트나 튜플 안의 원소를 랜덤하게 섞는다.

 

-seq 중 하나를 뽑기: random.choice(seq)

This is a widely used function in practice, wherein you would want to randomly pick up an item from a List/sequence.

seq는 sequence의 줄임이다. 

파이썬에서 sequence는 흐름이 있는, 순서가 있는, 차례가 있는 등으로 해석이 가능하다. 

예를 들어 [1,2,3,4,5] 는 sequence가 있다고 본다.

 

-seq 중 k 길이만큼 뽑기: random.sample(seq, k)

Returns a random sample from a sequence of length k.

 

6. seed() : 난수 결과값 고정!

random.seed() 
This initializes a random number generator. To generate a new random sequence, a seed must be set depending on the current system time. random.seed() sets the seed for random number generation.

먼저 seed()에 대해 알아보자.

랜덤하게 5번 가위바위보를 한다고 생각해보자. 

내가 낸 모양이 

[가위, 가위, 보, 주먹, 가위] 라고 한다. 

 

다음에 또 5번 가위바위보를 한다면 어떤 모양을 낼까?

[가위, 가위, 보, 주먹, 가위]  똑같이 낼 수도 있겠지만

[보, 가위, 주먹, 보, 가위]

[보, 보, 보, 주먹, 가위]

등으로 그 시간, 내 마음에 따라 랜덤하게 낼 것이다. 

 

컴퓨터도 랜덤 난수를 발생시킬 때, 현재 시간에 의존하여 시드를 설정하여 난수를 발생시킨다. 

그래서 매번 난수가 달라진다.

 

하지만 seed(1) 처럼

시드 안에 숫자를 넣어주게 되면  

난수가 나오지만 이전에 발생시켰던 난수를 기억하여 

그것이 그대로 나온다.

파이썬 랜던 모듈에 대해 더 깊게 공부하고 싶다면 아래의 사이트를 참고하면 된다. 

https://www.askpython.com/python-modules/python-random-module-generate-random-numbers-sequences

 

Python random Module - Generate Random Numbers/Sequences - AskPython

This article is about the random module in Python, which is used to generate pseudo-random numbers for various probabilistic distributions.

www.askpython.com