Kotlin 랜덤 숫자 (난수) 생성
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