[random] Kotlin에서 난수를 어떻게 얻을 수 있습니까?

루비와 같이 두 매개 변수 사이의 임의의 정수를 반환 할 수있는 일반적인 방법은입니다 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또는 ThreadLocalRandomJDK> 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 훌륭한 대답 나는 다음과 같이 변경했다.

  1. (0..n)은 Kotlin에 포함됨을 의미합니다.
  2. (0에서 n까지)는 Kotlin에서 독점적임을 의미합니다.
  3. 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