<개인공부>/[Python]

[python] 파이썬 랜덤함수(random)에 대해서

BlockDMask 2019. 12. 11. 21:06
반응형

안녕하세요. BlockDMask 입니다.
프로그램을 만들다 보면 보면 랜덤 숫자를 생성해야 할 경우가 많은데요.
오늘은 파이썬에서 랜덤한 수를 구할 수 있는 랜덤함수에 대해서 알아보려고 합니다.

지난번에 파이썬을 이용해서 로또 프로그램을 만들어 봤었는데요.
그때 랜덤함수를 많이 사용했었습니다.

랜덤함수 예제로 좋은 프로그램 이었습니다. 혹시 궁금하다면 로또 프로그램 [바로가기]

 

<목차>

1. 파이썬 랜덤함수

- random.random()

- random.uniform(a, b)

- randint(a, b)

- randrange(a, b), randrange(b)

- random.choice(seq)

- random.sample(seq or set, N)

- random.shuffle(list)

2. 파이썬 random 예제

 

 

 

1. 파이썬 랜덤함수


▶ 랜덤 함수에 대해서

파이썬에서 랜덤 관련한 함수들을 모아놓은 모듈 입니다.

랜덤 함수들을 사용하기 위해서는 import random을 해야합니다.

 

import random
 

 

이렇게 랜덤을 임포트 하게 되면 이제 random.함수이름() 을 통해서 랜덤 모듈에 존재하는 함수들을 가지고와서 사용할 수 있습니다.

랜덤 모듈에 존재하는 함수들을 소개하겠습니다. 

(모든 함수를 소개하는것은 아닙니다. 일부 자주 사용할 것 같은 함수들만 소개하겠습니다.)

(함수들의 기준은 파이썬 3.8 기준입니다.)

 

1. random.random()

random.random() 함수는 0.0에서부터 1.0 사이의 실수(float)를 반환합니다. [0.0, 1.0) 

정확한 범위는 1.0을 포함하지 않는 범위 입니다. (0.0 <= x < 1.0)

x = random.random()

print(x)    # 0.00000~0.999999...

 

2. random.uniform(a, b)

random.uniform 함수는 인자로 들어온 a~b 사이의 실수(float)를 반환합니다.

uniform 함수의 랜덤 범위는 a <= x <= b 입니다.

 

x = random.random(10, 20)

print(x)    # 10.00000 <= x <= 20.00000

 

3. randint(a, b)

randint 함수는 인자로 들어온 a, b 사이의 랜덤한 정수(int)를 반환합니다.

반환하는 x는  a, b를 포함한 범위 입니다. (a <= N <= b)

randrange 함수에 a, b+1을 넣은것과 동일하게 동작합니다.

 

x = random.randint(10, 20)

print(x)    # 10 <= x <= 20

 

4. randrange(a, b), randrange(b)

randrange 함수는 매개변수 1개 버전, 2개 버전이 존재합니다.

randrange(a, b)는 a <= x < b 의 범위 내에서의 랜덤한 정수(int)를 반환합니다. b를 포함하지 않는 범위입니다!

randrange(b)는 0 <= x < b 의 범위 내에서의 랜덤한 정수(int)를 반환합니다.  b를 포함하지 않습니다!

 

x1 = random.randrange(10, 20)

print(x1)    # 10 <= x < 20 사이의 랜덤한 int 반환

x2 = random.randrange(20)

print(x2)    # 0 <= x < 20 사이의 랜덤한 int 반환

 

 

5. random.choice(seq)

choice 함수는 매개변수로 seq 타입을 받습니다. 시퀀스 데이터 타입은 문자열, 튜플, range, 리스트 타입들을 말합니다.

시퀀스 함수는 인자로 받은 리스트, 튜플, 문자열, range 에서 무작위로 하나의 원소를 뽑습니다.

만약, 비어있는 시퀀스 타입의 객체를 인자로 넣는다면 (ex. 리스트가 비어있다면) indexError 의 예외가 발생합니다.

(indexError : 시퀀스의 인덱스가 범위를 벗어났을때 발생하는 에러)

 

x1 = random.choice('BlockDMask')

print(x1)    # 'BlockDMask' 문자열중 랜덤한 문자를 반환

x2 = random.choice('')

print(x2)    # indexError 발생

 

 

6. random.sample(seq or set, N)

첫번째 매개 변수로 시퀀스 데이터 타입(튜플, 문자열, range, 리스트) 또는 set 타입을 받을 수 있습니다.

두번째 매개 변수로는 랜덤하게 뽑을 인자의 개수 입니다.

sample 함수는 첫번째 인자로 받은 시퀀스데이터 or set에서 N개의 랜덤하고, unique하고, 순서상관없이 인자를 뽑아서 리스트로 만들어서 반환해줍니다.

sample의 특징 2가지

1. unique라는것이 중요합니다. 겹치지 않는 element를 반환한다는 것인데

- 'abc' 라는 문자열 있다고 할때 N에 2를 넣을때 겹치지 않게 a,b 혹은 b,c 혹은 c,a를 반환 합니다. (순서 상관없음)

- 'aaa' 라는 문자열이 있다고 할때 N에 2를 넣으면 겹치지 않게 a,a, 혹은 a,a 혹은 a,a 를 반환 합니다. (색으로 구분했습니다, 순서상관없음)

값이 중요한게 아니라 배열의 위치가 겹치지 않게 유니크한 것을 뽑는다는 이야기가 하고 싶었습니다.

다시한번 말씀드리자면, str = 'aaa'가 있을때 str[0],str[1] or str[1],str[2] or str[2],str[0] 을 뽑는다는 것 입니다.

 

2. 만약에 두번째 매개변수 N이 seq, set의 인자의 개수를 넘어갈때 valueError가 발생합니다. 

- 'abc'라는 문자열을 첫번째 인자로 넣고, 두번째 인자 N를 3을 넘어가는 수인 10을 넣었다고 한다면 valueError가 발생하게 됩니다.

 

arr1 = 'abc'

print(arr1, 2) # ['a','b'] or ['b','c'] or ['c','a'] 순서는 바뀔수있음

arr2 = 'ccc'

print(arr2, 10) # valueError 발생

arr3 = 'ccc'

print(arr3, 3) #['c','c','c'] 반환

 

7 . random.shuffle(seq)

셔플 함수는 데이터의 순서를 무작위로 랜덤하게 바꾸어 주는 함수 입니다.

매개변수 x에는 시퀀스 데이터 타입이 들어가게 됩니다. 하지만 내부의 값을 무작위로 바꿔야 하기 때문에 

내부인자를 변경할 수 있는 리스트만 가능하게 됩니다. (문자열, 튜플 및 range(a,b)는 불가능)

 

random.suffle(리스트) 의 반환은 없고, 인자로 들어온 리스트 내부의 데이터를 무작위로 섞습니다.

 

arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

print(arr)    # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 

random.shuffle(arr)    # 셔플셔플셔플 빰빰빰빠밤

print(arr)    # [10, 5, 6, 7, 8, 9, 2, 3, 4, 1]  무작위로 변경됨.

 

 

2. 파이썬 random 예제


▶  파이썬 랜덤 예제1 (random, uniform, randint, randrange)

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
import random
 
# 1. random.random()
x1 = random.random()
print("1. random.random()            : " + str(x1))
 
 
 
# 2. random.uniform(a,b)
x2 = random.uniform(01)
print("2-1. random.uniform(0,1)      : " + str(x2))
 
x3 = random.uniform(1020)
print("2-2. random.uniform(10,20)    : " + str(x3))
 
 
 
# 3. random.randint(a, b)
x4 = random.randint(100200)  # 100~200
print("3. random.randint(100,200)     : " + str(x4))
 
 
 
# 4. random.randrange(a, b) / random.randrange(b)
x5 = random.randrange(100200)  # 100~199
print("4-1. random.randrange(100,200) : " + str(x5))
 
x6 = random.randrange(200)  # 0~199
print("4-2. random.randrange(200)     : " + str(x6))
cs

 

결과

 

 

▶  파이썬 랜덤 예제2(choice, sample, shuffle)

30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 5. random.choice(seq)
x7 = random.choice('BlockDMask')
print("5-1. random.choice('BlockDMask'): " + str(x7))
print("5-2. random.choice('')          : [indexError]")  # 비어있으면 에러.
 
 
# 6. random.sample(seq or set, N)
x8 = random.sample([12345], 3)
print("6-1. random.sample([1,2,3,4,5], 3) : " + str(x8))
 
x9 = random.sample('BlockDMask'5)
print("6-2. random.sample('BlockDMask', 5) : " + str(x9))
 
x10 = random.sample('aaaa'3)  # 실제 문자가 같은지는 상관없음, index가 unique.
print("6-3. random.sample('aaaa', 3) : " + str(x10))
 
print("6-4. random.sample('aaaa', 10) : [valueError]"# 길이를 넘으면 에러.
 
 
# 7. random.shuffle(list)
arr1 = [1,2,3,4,5,6,7,8,9,10]
print("7-1. random.shuffle([1~10]) before : " + str(arr1))
random.shuffle(arr1)
print("7-1. random.shuffle([1~10]) after  : " + str(arr1))
cs

 

▷ 결과

 

 

이상으로 파이썬 랜덤함수 포스팅을 마치겠습니다. 감사합니다.

반응형