코린이 탈출기

숫자를 임의로 뽑는 코드 - List & Set 본문

안드로이드/안드로이드

숫자를 임의로 뽑는 코드 - List & Set

50HEE 2021. 8. 11. 16:45

복권과 같이 숫자를 무작위로 섞어 6개를 뽑는 코드를 작성하겠습니다.

 

 

 

우선 숫자를 무작위로 섞는 코드는 이미 안드로이드 스튜디오에서 제공하는 기능입니다.

val random = Random()

위와 같이 코드를 작성하면 숫자가 무작위로 섞이게 됩니다.

Random( ) 여기서 ( ) 안에는 원래 랜덤 객체에서 받는 'seed: Int'라는 인자가 있습니다.

사실 Random()은 무작위가 아닌 seed에 값을 대입하여 작동하는 것입니다.

즉, seed에 값을 대입하면 다음 숫자가 무엇인지 예측이 가능하다는 것입니다.

이러한 예측이 가능한 숫자가 아닌 무작위로 하고 싶을 경우에는 어떻게 해야 할까요?

가장 많이 사용하는 개념은 시간을 사용하는 것입니다.

시간은 지금도 흐르고 다시 돌아갈 수 없기 때문입니다.

코틀린에서는 nimoseconds를 사용하여 세밀한 시간을 이용합니다.

이러한 시간을 사용하는 방법은 ( ) 안을 비워두면 자동으로 설정이 됩니다.

 

이제 무작위로 숫자 6개를 뽑는 코드를 작성하겠습니다.

7번 줄은 숫자를 무작위로 설정하였습니다.

9번 줄은 6개의 숫자를 뽑기 위해서 for문을 사용하였습니다.

(i in 1..6)은 6개의 숫자를 뽑는다는 것입니다.

10번 줄은 이제 숫자를 뽑은 것을 보이기 위해 println을 사용하였습니다.

무작위로 뽑은 변수인 random을 이용하여 숫자의 범위를 정하기 위해 nextInt( )를 사용하였습니다.

( ) 안에는 숫자의 범위를 정하는 것인데 코틀린에서는 순서가 0번째부터 존재하기 때문에 0부터 45번째는 숫자 44까지만 출력이 되기 때문에 숫자에 +1을 해줘서 45까지 나올 수 있도록 작성해줍니다.

위와 같이 작성을 하면 1부터 45의 숫자 중에서 무작위로 6개를 뽑을 수 있습니다.

하지만 위의 코드는 숫자가 중복될 수 있습니다.

 

 

숫자의 중복을 피하기 위해 List와 Set을 이용해서 코드를 작성해보겠습니다.

 

 

 

16번 줄은 위에서 작성한 숫자를 무작위로 섞는 코드로 동일합니다.

17번 줄의 list 변수는 변경이 가능한 list로 설정하기 위해 mutableListOf로 설정하여 list에 새로운 숫자를 넣을 수 있게 합니다.

< > 안에는 숫자를 뽑을 것이므로 Int를 작성하였습니다.

숫자의 중복을 막기 위해서 while 구문을 이용하겠습니다.

19번 줄은 list의 크기가 6보다 커지면 멈추는 형식으로 작성하였습니다.

20번 줄은 1부터 45번의 숫자의 범위를 설정하였습니다.

21 ~ 25번 줄의 if 문은 list의 안의 숫자를 확인하여(contains), 반복되는 숫자가 있을 경우 넘어가고(continue), 만약 없다면 숫자를 추가하도록 하였습니다.

 

 

 

이번에는 set을 이용하겠습니다. 

set의 경우에는 숫자가 중복되지 않습니다.

그래서 list 보다 조금 더 간결한 코드를 작성할 수 있습니다.

31번 줄은 위에서 작성한 숫자를 무작위로 섞는 코드로 동일합니다.

32번 줄의 set 변수는 변경이 가능한 set으로 설정하기 위해 mutableSetOf로 설정하여 set에 새로운 숫자를 넣을 수 있게 합니다.

< > 안에는 숫자를 뽑을 것이므로 Int를 작성하였습니다.

34 ~ 37번 줄은 while 구문을 이용해서 set의 크기가 6이 넘으면 숫자를 추가하는 것을 멈추는 코드를 작성하였습니다.

 

 

 

이번에는 list를 이용해서 1부터 45까지 숫자를 우선 불러서 list를 섞은 후 앞에서 6번째까지 자르는 방식으로 코드를 짜보았습니다.

41번 줄은 list 변수는 변경이 가능한 list로 설정하기 위해 mutableListOf로 설정하여 list에 새로운 숫자를 넣을 수 있게 합니다.

< > 안에는 숫자를 뽑을 것이므로 Int를 작성하였습니다.

apply{}를 통해 mutableListOf()를 새로 초기화하여 for문을 이용해서 1부터 45를 넣어보겠습니다. 42 ~ 44번 줄에 해당합니다.

46번 줄은 list를 shuffle()을 통해서 숫자들을 섞어줍니다.

기존에는 랜덤 함수를 사용하였지만, 이번에는 shuffle()을 이용하였습니다.

마지막으로 48번 줄은 subList를 이용해서 원하는 숫자만큼을 잘라 줍니다.

subList() 안에는 2가지 숫자를 넣어주어야 하는데, fromIndex와 toIndex로 어디서부터 어디까지 잘라 줄 것인지 숫자로 넣어주면 됩니다.

여기서 toIndex는 해당 범위는 포함 안 하는 것으로 즉, 이전까지의 범위만 포함하는 것입니다.

위와 같은 코드를 작성하면 이전의 코드와 동일하게 작동할 것입니다.

 

 

 

코드의 경우 코드의 길이가 길거나 짧거나의 차이라서 길더라도 읽기 쉬울 수 있고, 짧더라도 읽기 어려울 수 있습니다.

어떤 코드가 옳고 틀리다고는 말할 수는 없고, 사람에 따라 쓰는 코드의 차이가 있을 뿐입니다.

Comments