퀀터스 코딩테스트 과제
늘 쓰는 random 함수를 안 쓰고 난수를 구현해보는게
꽤 재밌고 흥미로웠다.
그리고 유닛테스트를 사실 제대로 안 해보고 있었다는게 계속 마음에 짐으로 남아있었는데, 이번에 튜토리얼 영상을 보고 혼자 따라해보면서 유닛테스트를 처음으로 써봤다.
새로운걸 하는 날은 언제나 뿌듯하다.
assertIn 함수를 사용해서 결과값이 [0, 1] 리스트 안에 포함되는지를 확인해 보았습니다.
def test_get_1_or_0(self):
self.assertIn(random_n.get_1_or_0(),[0,1])
0미만의 숫자를 변수로 두었을 경우:
value error를 반환하기 때문에 assertRaises를 이용해서 value error를 확인해 보았습니다.
def test_variable_below_zero(self):
'''
get_random 함수에 0미만의 숫자를 변수로 두었을 경우, value error
'''
self.assertRaises(ValueError, random_n.get_random, -10)
print(10,'value error')
0이상의 숫자를 변수로 두었을 경우:
def test_variable_above_zero(self):
'''
get_random 함수에 0이상 숫자를 변수로 두었을 경우
'''
TEST_LIST=[0,1,3,10,2.1,10000000000000000]
for i in TEST_LIST:
num=random_n.get_random(i)
self.assertTrue(
num>=0
and num<=i
and isinstance(num, int)
)
def test_check_time(self):
'''
걸리는 시간 체크
'''
TESTING_NUM=100000000000000000000000000000000000000000000000000000000000000000000000000
start= time.time()
random_n.get_random(TESTING_NUM)
finish= time.time()
print(finish-start)
>>> 0.0010020732879638672
조금 더 시간을 줄여볼 수 없을까 싶어서 재귀적으로 함수를 불러오는 방식이 아닌 while문을 사용해 봤습니다.
기존 코드:
def get_random(n):
'''0~n사이의 정수를 랜덤으로 반환하는 함수'''
if n<0:
raise ValueError('Cannot get random number below zero')
binary = format(floor(n), 'b')
ls=[get_1_or_0() for i in binary]
result= int(''.join(map(str,ls)),2)
if result>n:
return get_random(n)
return result
이후코드:
def get_random(n):
'''0~n사이의 정수를 랜덤으로 반환하는 함수'''
if n<0:
raise ValueError('Cannot get random number below zero')
binary = format(floor(n), 'b')
while True:
ls=[get_1_or_0() for i in binary]
result= int(''.join(map(str,ls)),2)
if result<=n:
return result
def test_check_time(self):
'''
걸리는 시간 체크
'''
TESTING_NUM=100000000000000000000000000000000000000000000000000000000000000000000000000
start= time.time()
random_n.get_random(TESTING_NUM)
finish= time.time()
print(finish-start)
>>> 0.00028824806213378906
0미만의 숫자를 변수로 두었을 경우:
def test_check_random(self):
'''
함수가 균등하게 결과를 나타내는지 체크
'''
TRYS=100000
count0=0
count1=0
count2=0
for i in range(TRYS):
if random_n.get_random(2)==0:
count0+=1
if random_n.get_random(2)==1:
count1+=1
if random_n.get_random(2)==2:
count2+=1
print(f'count0={count0},count1={count1}, count2={count2}')
self.assertTrue(
min(count0,count1)/max(count0,count1)>0.98
and min(count1,count2)/max(count1,count2)>0.98
and min(count0,count2)/max(count0,count2)>0.98
)
>>>count0=33448, count1=33241, count2=33473