티스토리 뷰

Kotlin

랜덤 함수 Random( )

IT Knowledge Share 2021. 7. 28. 00:04
반응형

코틀린 함수 중의 Random 함수는 무작위한 값을 추출하는 함수입니다. 이 함수의 인자로는 Seed 값이 들어가는데, 해당 값을 랜덤으로 만들어 줘야, 무작위 값이 함수를 통해서 도출되게 됩니다. Seed 값은 milisecond 또는 nanosecond 함수를 이용해서 만들어주면, 원하는 랜덤한 숫자가 나올 수 있게 됩니다. Random(100) 처럼, 시드 값을 '100', 이렇게 지정해 버리면, 같은 시드 값이 들어가서 같은 숫자가 나오게 됩니다. 따라서 Random( ) 처럼 사용해야 nanosecond 함수에 의해 같은 값이 거의 나오지 않는 무작위한 숫자가 나오게 됩니다.

 

아래의 코드를 보고 더욱 자세히 이해해 봅시다. 우선 랜덤 함수에 시드 값을 넣지 않아 무작위한 값이 나오도록 합니다. 반복문의 경우, iterator 부분을 보면 5번 반복하게 만들어, 5개의 숫자를 추출합니다. 

nextInt 함수를 사용해서 1~10까지의 값 중에서 하나의 난수를 뽑히도록 할 것인데, 이 함수는 바운드된 값이 리턴됩니다. 따라서 1~9 사이의 값만 리턴되므로, +1을 해줘야 합니다.

val random = Random()

for (i in 1..5){
    println("${random.nextInt(10) + 1}")
}
반응형

다음에는 컬렉션을 이용해서 랜덤 함수를 사용해봅니다.

특히 Set 컬렉션을 사용하면, 중복되는 값을 막을 수 있습니다. 변경 가능한 컬렉션을 사용해야 하므로, mutable 컬렉션을 사용합니다.

 

아래는 mutableListOf 함수를 사용한 경우입니다. while 문의 조건을 list.size < 10으로 설정하면서, 10개의 난수를 뽑을 것입니다. if 문을 보면 contains 함수를 사용했는데, 리스트가 1~100개 수의 중에서 뽑힌 난수를 포함하고 있는지 확인하고, continue를 통해서 다시 while문으로 돌아갑니다. 만약 난수를 포함하고 있지 않다면, list.add( ) 처럼 해당 수를 담고 빠져 나오게 됩니다. 이렇게 10번을 반복해서, 1~100 중 10개의 난수가 뽑히게 됩니다. 

* ListOf는 중복을 허용하므로, contains 함수를 사용하였습니다.

val random = Random()
var list = mutableListOf<Int>()
    
while (list.size < 10){
        val anyNumber = random.nextInt(100)+1

        if (list.contains(anyNumber)){
            continue
        }
        
        list.add(anyNumber)
}
    
print(list)

mutableSetOf 함수를 사용하면 다음과 같습니다. 이 경우에는 contains 함수를 통해서 확인할 필요가 없습니다. 왜냐하면, Set 컬렉션은 중복 값을 허용하지 않기 때문입니다.

 

val random = Random()
var list = mutableSetOf<Int>()
    
while (list.size < 10){
    val anyNumber = random.nextInt(100)+1        
    list.add(anyNumber)
}
    
print(list)

다음은 랜덤 함수를 사용하지 않고, 리스트에 숫자를 담아서 난수를 추출한 경우입니다. listOf 함수를 사용해 리스트를 만들고, apply 함수를 사용하여 초기화 시킵니다. apply가 실행되기 전에 앞의 함수를 그대로 this로 받아서 사용하는데, this에 add 함수를 이용해 100개의 수를 할당합니다.

 

이후로 shuffle 함수를 사용해 수를 섞고, 출력하면 됩니다. 출력 시 subList 함수를 사용하여 10개를 출력한 경우입니다.

fun main() {
     val list = mutableListOf<Int>().apply{        
         for (i in 1..100) {
                this.add(i)
             }
     }
     
     list.shuffle()
   
    print(list.subList(0, 10))
}
반응형

'Kotlin' 카테고리의 다른 글

Null Safety  (0) 2021.07.09
lateinit, lazy init  (0) 2021.07.09
람다 표현식 Lamda Expression  (0) 2021.07.09
데이터 클래스 Data Class  (0) 2021.07.08
범위 함수 Scope Function (Apply, Also, Let, With, Run)  (0) 2021.07.08
댓글