Kotlin에서 난수 얻기

David Mbochi Njonge 2023년6월20일
  1. Kotlin에서 IntRangerandom() 확장 함수 사용
  2. Kotlin에서 범위 포함과 함께 random() 사용
  3. Kotlin에서 독점 범위로 random() 사용
  4. Kotlin에서 Iterableshuffled() 확장 함수 사용
  5. Kotlin에서 ThreadLocalRandom 사용
  6. 결론
Kotlin에서 난수 얻기

난수는 각 숫자가 생성될 확률이 동일하도록 보장하는 알고리즘을 사용하여 일련의 숫자에서 생성됩니다.

숫자 외에도 다양한 유형의 데이터 유형을 생성할 수 있습니다. 예를 들어 java.utilUUID.randomUUID() 메서드를 사용하여 임의의 문자열을 생성할 수 있습니다.

개발자가 임의의 문자열을 생성할 수 있도록 하는 이 기능은 전자 상거래 환경에서 데이터에 대한 고유 식별자 생성, 고유 암호 생성 및 주문 추적 식별자 생성에 도움이 되므로 매우 중요합니다.

이 튜토리얼에서는 Kotlin을 사용하여 난수를 생성하는 데 활용할 수 있는 방법을 보여줍니다.

Kotlin에서 IntRangerandom() 확장 함수 사용

확장 기능은 기존 코드를 수정하거나 데코레이터 패턴과 같은 디자인 패턴을 사용하지 않고 클래스에 기능을 추가하는 방법입니다.

IntelliJ 개발 환경으로 이동하여 파일 > 새로 만들기 > 프로젝트를 선택합니다. 열리는 창에서 프로젝트 namekotlin-random으로 입력하고 Language 섹션에서 Kotlin을 선택한 다음 Build System 섹션에서 Intellij를 선택하고 마지막으로 Create 버튼을 누릅니다. 새 프로젝트를 생성합니다.

Kotlin에서 범위 포함과 함께 random() 사용

kotlin 폴더 아래에 Main.kt 파일을 만들고 다음 코드를 복사하여 파일에 붙여넣습니다.

fun exampleOne(): Int{
   return (0..10).random();
}
fun main(){
    println("... Example One ...")
    println(exampleOne());
}

이 코드에서는 Int를 반환하는 exampleOne()이라는 메서드를 만들었습니다. 정수는 메소드의 random() 함수에 의해 무작위로 생성됩니다.

random() 함수는 IntRange의 확장 함수로 제공된 범위에서 임의로 생성된 요소를 반환합니다.

범위가 비어 있으면 메서드에서 IllegalArgumentException을 throw합니다. 범위의 첫 번째 요소가 범위의 마지막 요소보다 크면 범위가 비어 있습니다.

random() 함수는 뒤에서 RandomnextInt() 확장 기능을 사용하여 제공된 범위 내에서 균일하게 분포된 숫자를 생성합니다.

생성된 숫자는 0에서 10까지의 숫자가 될 수 있습니다. 위의 코드를 여러 번 실행하면 범위 내 임의의 숫자를 얻을 수 있음을 알 수 있습니다.

출력:

... Example One ...
3

Kotlin에서 독점 범위로 random() 사용

이전 예제를 주석 처리하고 다음 코드를 복사하여 그 뒤의 Main.kt 파일에 붙여넣습니다.

fun exampleTwo(): Int{
    return (0 until  10).random();
}
fun main(){
    println("... Example Two ...")
    println(exampleTwo());
}

이전 예제에서는 rangeTo() 메서드를 나타내는 데 사용되는 범위에서 ..를 사용했습니다. 그러나 이 예제에서는 Int.until() 확장 함수를 나타내는 until을 사용했습니다.

until() 확장 함수는 시작 값에서 제공된 마지막 값을 제외할 때까지의 범위를 반환합니다. 시작 값은 실행 중인 현재 값을 나타내기 위해 종종 this로 표시됩니다.

이전 예제를 여러 번 실행하면 난수는 항상 생성되지만 10 값은 생성되지 않습니다.

출력:

... Example Two ...
5

Kotlin에서 Iterableshuffled() 확장 함수 사용

shuffled() 함수는 Iterable 인터페이스의 확장 함수이며 요소의 List를 반환합니다. 반환된 목록을 통해 Collection 인터페이스의 random() 확장 기능을 사용하여 난수를 생성할 수 있습니다.

이전 예제에 주석을 달고 다음 코드를 복사하여 Main.kt 파일 뒤에 붙여넣습니다.

fun exampleThree(): Int{
  return (0..10).shuffled().random()
}
fun main(){
    println("... Example Three ...")
    println(exampleThree());
}

이 코드에서는 메서드에서 생성된 정수를 반환하는 exampleThree()라는 메서드를 만들었습니다.

0에서 10까지의 숫자 범위는 shuffled() 함수에 의해 섞인 목록으로 반환됩니다. 범위가 포함됩니다.

범위를 배타적으로 지정하려면 이전 예제에서 설명한 대로 Int.until() 함수를 사용하십시오.

random() 함수는 섞인 목록에서 난수를 생성하고 목록이 비어 있으면 NoSuchElementException을 발생시킵니다.

이 코드를 여러 번 실행하면 실행될 때마다 섞인 목록에서 임의의 숫자가 생성됩니다.

출력:

... Example Three ...
7

Kotlin에서 ThreadLocalRandom 사용

현재 스레드는 ThreadLocalRandom을 사용하여 난수를 생성합니다. 이 생성기는 오버헤드와 경합을 줄이기 위해 동시 프로그램에서 주로 사용됩니다.

생성기는 특히 여러 프로그램이 스레드 풀에서 병렬로 난수에 액세스할 때 사용됩니다.

모든 사용법이 ThreadLocalRandom.current.nextX() 형식인 경우 XnextInt(), nextLong() 등일 수 있습니다. 여러 스레드에서 생성기를 공유할 수 없도록 합니다. .

current() 메서드는 ThreadLocalRandom 객체를 반환하는 정적 메서드이며 현재 스레드에서만 호출할 수 있습니다.

이전 코드에 주석을 달고 그 뒤의 Main.kt 파일에 다음 코드를 복사하여 붙여넣으십시오.

import java.util.concurrent.ThreadLocalRandom

fun exampleFour(bound: Int): Int{
    return ThreadLocalRandom.current().nextInt(bound)
}
fun main(){
     println("... Example Four ...")
    println(exampleFour(9))
}

nextInt() 메서드는 0에서 바운드로 제공한 숫자를 제외하고 균일하게 분포되는 유사 난수를 생성합니다.

bound가 양수가 아닌 경우 메소드는 IllegalArgumentException을 발생시킵니다. 위의 코드를 여러 번 실행하면 균일하게 생성되는 다른 유사난수를 얻게 됩니다.

출력:

... Example Four ...
3

결론

이 가이드에서는 Kotlin에서 난수를 생성할 수 있는 다양한 방법을 설명했으며, 다루는 접근 방식은 다음과 같습니다.

  1. IntRangerandom() 확장 기능을 사용합니다.
  2. Iterableshuffled() 확장 기능 사용.
  3. ThreadLocalRandom 사용.

또한 범위에서 .. 또는 까지를 사용하여 생성된 범위를 포함하거나 제외하도록 수정하는 방법도 배웠습니다.

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub