Language/Kotlin

Kotlin 랜덤 숫자 (난수) 생성

서리★ 2024. 7. 17. 16:13

Kotlin에서의 랜덤 숫자 (난수) 생성 방법을 소개한다.

 

 


 

1. kotlin.random.Random

 Kotlin 표준 라이브러리에서 제공하는 난수 생성 클래스로 nextInt(), nextLong(), nextDouble() 등의 메서드를 사용하여 다양한 타입의 난수를 생성할 수 있다.

* 매개변수로 난수 범위 지정 가능

package com.example.kotlinsyntax

import kotlin.random.Random

fun main() {
    // -2,147,483,648 <= randInt1 <= 2,147,483,647 사이의 무작위 정수(Int)
    val randInt1 = Random.nextInt()
    // 0 <= randInt2 < 10 사이의 무작위 정수(Int)
    val randInt2 = Random.nextInt(10)
    // 1 <= randInt3 < 10 사이의 무작위 정수(Int)
    val randInt3 = Random.nextInt(1, 10)
    
    println(randInt1)    // 출력: -1774151072
    println(randInt2)    // 출력: 1
    println(randInt3)    // 출력: 7

    // -9,223,372,036,854,775,808 <= randLong1 <= 9,223,372,036,854,775,807 사이의 무작위 정수(Long)
    val randLong1 = Random.nextLong()
    // 0 <= randLong2 < 10 사이의 무작위 정수(Long)
    val randLong2 = Random.nextLong(10)
    // 1 <= randLong2 < 10 사이의 무작위 정수(Long)
    val randLong3 = Random.nextLong(1, 10)
    
    println(randLong1)    // 출력: 2279099622582522962
    println(randLong2)    // 출력: 1
    println(randLong3)    // 출력: 7

    // 1.0 <= randDouble < 10.0 사이의 무작위 실수(Double)
    val randDouble1 = Random.nextDouble()
    // 0 <= randLong2 < 10 사이의 무작위 실수(Double)
    val randDouble2 = Random.nextDouble(10.0)
    // 1 <= randLong3 < 10 사이의 무작위 실수(Double)
    val randDouble3 = Random.nextDouble(1.0, 10.0)
    
    println(randDouble1)    // 출력: 0.3013761567266877
    println(randDouble2)    // 출력: 3.8195650223775415
    println(randDouble3)    // 출력: 8.02996326627739
}

 

 


 

2. java.util.Random

 java.util.Random 클래스는 Java 표준 라이브러리에서 제공되며 Kotlin에서도 사용할 수 있다. nextInt(), nextLong(), nextDouble() 등의 메서드를 사용하여 난수를 생성할 수 있다. kotlin.random.Random 방식과 비슷하지만 직관적이지 못하므로 kotlin.random.Randm 방식을 이용하는 것이 낫다.

* 매개변수 bound로 nextInt(bound)만 범위 한정적 지정 가능

package com.example.kotlinsyntax

import java.util.Random

fun main() {
    val random = Random()

    // -2,147,483,648 <= randInt1 <= 2,147,483,647 사이의 무작위 정수(Int)
    val randInt1 = random.nextInt()
    // 0 <= randInt2 < 10 사이의 무작위 정수(Int)
    val randInt2 = random.nextInt(10)
    
    println(randInt1)    // 출력: 1585759486
    println(randInt2)    // 출력: 0

    // -9,223,372,036,854,775,808 <= randLong <= 9,223,372,036,854,775,807 사이의 무작위 정수(Long)
    val randLong = random.nextLong()
    
    println(randLong)    // 출력: -4247132444023219134

    // 0 <= randDouble < 1 사이의 무작위 실수(Double)
    val randDouble = random.nextDouble()
    
    println(randDouble)    // 출력: 0.3741730887904876
}

 

 


 

3. Math.random()

 Java 표준 라이브러리에서 제공하는 Math 클래스의 random() 함수이다. Math.random()은 0 이상 1 미만의 Double 형태의 난수를 생성한다.

* 매개변수로 난수 범위 지정 불가

package com.example.kotlinsyntax

fun main() {
    // 0 <= n < 1 사이의 무작위 실수(Double)
    println(Math.random())    // 출력: 0.0228725126835943
    println(Math.random())    // 출력: 0.8510430769472556
    println(Math.random())    // 출력: 0.11146111885820553
}

 

 


 

4. Range.random()

 Kotlin 표준 라이브러리의 IntRange, LongRange, CharRange 등에서 제공하는 확장함수이다. 숫자의 범위가 정의된 Range 객체의 random() 메서드를 호출하면 그 범위에서 Int 형태의 난수가 반환된다. 범위를 직관적으로 볼 수 있어서 쉽게 사용하기 좋은 방식이라고 생각한다.

* Range 객체로 난수 범위 지정 가능

package com.example.kotlinsyntax

fun main() {
    // 1 <= n <= 10 사이의 무작위 정수(Int)
    val ran1 = (1 .. 10).random()    
    val ran2 = (1 .. 10).random()

    println(ran1)    // 출력: 4
    println(ran2)    // 출력: 10
}

 

 


 

5.ThreadLocalRandom

 ThreadLocalRandom 클래스는 Java에서 제공하는 난수 생성 클래스로, 멀티스레드 환경에서 안전하게 사용할 수 있다. 이 클래스는 각 스레드마다 별도의 난수 발생기를 제공하여 다중 스레드 환경에서 각 스레드가 독립적으로 난수를 생성할 수 있도록 보장한다. (Java 7부터 지원)

* 매개변수로 난수 범위 지정 가능

package com.example.kotlinsyntax

import java.util.concurrent.ThreadLocalRandom

fun main() {
    // -2,147,483,648 <= randInt1 <= 2,147,483,647 사이의 무작위 정수(Int)
    val randInt1 = ThreadLocalRandom.current().nextInt()
    // 0 <= n < 10 사이의 무작위 정수(Int)
    val randInt2 = ThreadLocalRandom.current().nextInt(10)
    // 1 <= n < 10 사이의 무작위 정수(Int)
    val randInt3 = ThreadLocalRandom.current().nextInt(1, 10)

    println(randInt1)    // 출력: -739322834
    println(randInt2)    // 출력: 2
    println(randInt3)    // 출력: 4

    // -9,223,372,036,854,775,808 <= randLong <= 9,223,372,036,854,775,807 사이의 무작위 정수(Long)
    val randLong1 = ThreadLocalRandom.current().nextLong()
    // 0 <= n < 10 사이의 무작위 정수(Long)
    val randLong2 = ThreadLocalRandom.current().nextLong(10)
    // 1 <= n < 10 사이의 무작위 정수(Long)
    val randLong3 = ThreadLocalRandom.current().nextLong(1, 10)

    println(randLong1)    // 출력: 6052172031733513284
    println(randLong2)    // 출력: 6
    println(randLong3)    // 출력: 2

    // 0 <= n < 1.0 사이의 무작위 실수(Double)
    val randDouble1 = ThreadLocalRandom.current().nextDouble()
    // 0 <= n < 10.0 사이의 무작위 실수(Double)
    val randDouble2 = ThreadLocalRandom.current().nextDouble(10.0)
    // 1.0 <= n < 10.0 사이의 무작위 실수(Double)
    val randDouble3 = ThreadLocalRandom.current().nextDouble(1.0, 10.0)

    println(randDouble1)    // 출력: 0.2964469191323983
    println(randDouble2)    // 출력: 7.426735015468528
    println(randDouble3)    // 출력: 8.004432691602375

    // true or false 무작위 논리값(Boolean)
    val randBoolean = ThreadLocalRandom.current().nextBoolean()

    println(randBoolean)    // 출력: false
}

 

 


 

6. SecureRandom

 위의 방법들은 정해진 패턴으로 랜덤 숫자를 생성한다. 그러므로 패턴을 찾아 생성되는 숫자를 예측할 수 있다. 하지만 SecureRandom은 예측이 불가능한 랜덤 숫자를 생성하여 보안 측면에서 좋다.

* 매개변수 bound로 nextInt(bound)만 범위 한정적 지정 가능

package com.example.kotlinsyntax

import java.security.SecureRandom

fun main() {
    // SecureRandom 인스턴스 생성
    val secureRandom = SecureRandom()

    // -2,147,483,648 <= n <= 2,147,483,647 사이의 무작위 정수(Int)
    println(secureRandom.nextInt())    // 출력: 528491294
    // 0 <= n < 10 사이의 무작위 정수(Int)
    println(secureRandom.nextInt(10))    // 출력: 3

    // -9,223,372,036,854,775,808 <= n <= 9,223,372,036,854,775,807 사이의 무작위 정수(Long)
    println(secureRandom.nextLong())    // 출력: -530587430848748866

    // 0.0 <= n < 1.0 사이의 무작위 실수(Double)
    println(secureRandom.nextDouble())    // 출력: 0.655972987578133
}

 

 


 

출처

https://codechacha.com/ko/kotlin-random-number/

 

Kotlin - 랜덤 숫자 생성 (Random, SecureRandom)

코틀린에서 무작위 숫자 생성 방법을 소개합니다. `Math.random()`는 `0 <= n < 1` 범위의 숫자(Double)를 무작위로 생성합니다. ThreadLocalRandom을 이용하여, 지정된 범위의 무작위 숫자 Int, Double, Long을 생성

codechacha.com