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/
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!