루비와 같이 두 매개 변수 사이의 임의의 정수를 반환 할 수있는 일반적인 방법은입니다 rand(0..n)
.
어떠한 제안?
답변
내 제안은 IntRange 에서 다음과 같이 무작위 를 만드는 확장 함수입니다 .(0..10).random()
TL; DR Kotlin> = 1.3, 모든 플랫폼에서 하나의 랜덤
1.3부터 Kotlin은 자체 다중 플랫폼 랜덤 생성기를 제공합니다. 이 KEEP에 설명되어 있습니다. 아래 설명 된 확장은 이제 Kotlin 표준 라이브러리의 일부입니다. 간단히 다음과 같이 사용하십시오.
val rnds = (0..10).random()
코 틀린 <1.3
1.3 이전에는 JVM에서 Random
또는 ThreadLocalRandom
JDK> 1.6 인 경우 에도 사용 합니다.
fun IntRange.random() =
Random().nextInt((endInclusive + 1) - start) + start
이런 식으로 사용 :
// will return an `Int` between 0 and 10 (incl.)
(0..10).random()
함수 만 반환하도록하려면 1, 2, ..., 9
( 10
포함되지 않음) 다음으로 구성된 범위를 사용하십시오 until
.
(0 until 10).random()
JDK> 1.6으로 작업하는 경우 ThreadLocalRandom.current()
대신을 사용하십시오 Random()
.
KotlinJ 및 기타 변형
의 사용을 허용하지 않는 kotlinjs 및 기타 사용 사례 java.util.Random
에 대해서는 이 대안을 참조하십시오 .
또한 내 제안의 변형에 대해서는이 답변 을 참조하십시오 . 또한 임의 Char
의 확장 기능도 포함합니다 .
답변
from
(포함)과 to
(제외) 사이의 임의의 정수를 생성
import java.util.Random
val random = Random()
fun rand(from: Int, to: Int) : Int {
return random.nextInt(to - from) + from
}
답변
kotlin 1.2부터 다음과 같이 작성할 수 있습니다.
(1..3).shuffled().last()
큰 O (n)이지만 작은 목록 (특히 고유 한 값)의 경우 괜찮습니다 .D
답변
당신은 만들 수 확장 기능 과 유사 java.util.Random.nextInt(int)
하지만, 소요 한 IntRange
대신의 Int
바인드를 들어 :
fun Random.nextInt(range: IntRange): Int {
return range.start + nextInt(range.last - range.start)
}
이제 모든 Random
인스턴스에서 이를 사용할 수 있습니다 .
val random = Random()
println(random.nextInt(5..9)) // prints 5, 6, 7, or 8
자신의 Random
인스턴스 를 관리하지 않으려면 다음과 같이 편리한 방법을 정의 할 수 있습니다 ThreadLocalRandom.current()
.
fun rand(range: IntRange): Int {
return ThreadLocalRandom.current().nextInt(range)
}
이제 Random
인스턴스 를 먼저 선언하지 않고도 Ruby에서와 같이 임의의 정수를 얻을 수 있습니다 .
rand(5..9) // returns 5, 6, 7, or 8
답변
임의의 문자에 대한 다른 대답 에 가능한 변형
랜덤을 얻기 위해 Char
다음과 같은 확장 기능을 정의 할 수 있습니다
fun ClosedRange<Char>.random(): Char =
(Random().nextInt(endInclusive.toInt() + 1 - start.toInt()) + start.toInt()).toChar()
// will return a `Char` between A and Z (incl.)
('A'..'Z').random()
JDK> 1.6으로 작업하는 경우 ThreadLocalRandom.current()
대신을 사용하십시오 Random()
.
의 사용이 허용하지 않는 kotlinjs 및 기타 사용 사례의 경우 java.util.Random
, 이 답변이 도움이 될 것입니다.
Kotlin> = 1.3 랜덤에 대한 다중 플랫폼 지원
1.3부터 Kotlin은 자체 멀티 플랫폼 랜덤 생성기를 제공합니다. 이 KEEP에 설명되어 있습니다. 이제 확장을 정의하지 않고 Kotlin 표준 라이브러리의 일부로 직접 확장을 사용할 수 있습니다.
('a'..'b').random()
답변
의 오프 구축 @ s1m0nw1 훌륭한 대답 나는 다음과 같이 변경했다.
- (0..n)은 Kotlin에 포함됨을 의미합니다.
- (0에서 n까지)는 Kotlin에서 독점적임을 의미합니다.
- Random 인스턴스에 싱글 톤 객체 사용 (선택 사항)
암호:
private object RandomRangeSingleton : Random()
fun ClosedRange<Int>.random() = RandomRangeSingleton.nextInt((endInclusive + 1) - start) + start
테스트 사례 :
fun testRandom() {
Assert.assertTrue(
(0..1000).all {
(0..5).contains((0..5).random())
}
)
Assert.assertTrue(
(0..1000).all {
(0..4).contains((0 until 5).random())
}
)
Assert.assertFalse(
(0..1000).all {
(0..4).contains((0..5).random())
}
)
}
답변
[1, 10] 범위에서 임의의 예
val random1 = (0..10).shuffled().last()
또는 Java Random을 활용
val random2 = Random().nextInt(10) + 1
