我如何在Kotlin中获得一个随机数?

Yag*_*ias 122 random jvm kotlin

一种通用方法,可以返回2个参数之间的随机整数,如ruby rand(0..n).

有什么建议吗?

s1m*_*nw1 314

我的建议是一个扩展的功能IntRange创建这样的随机量:(0..10).random()

TL; DR Kotlin> = 1.3,所有平台都有一个随机数

从1.3开始,Kotlin自带多平台随机发生器.这个KEEP描述了它.下面描述的扩展现在是Kotlin标准库的一部分,只需使用它:

val rnds = (0..10).random()
Run Code Online (Sandbox Code Playgroud)

科特林<1.3

在1.3之前,在我们使用的JVM上,Random或者即使ThreadLocalRandom我们使用JDK> 1.6.

fun IntRange.random() = 
       Random().nextInt((endInclusive + 1) - start) + start
Run Code Online (Sandbox Code Playgroud)

像这样使用:

// will return an `Int` between 0 and 10 (incl.)
(0..10).random()
Run Code Online (Sandbox Code Playgroud)

如果您希望函数仅返回1, 2, ..., 9(10不包括),请使用以下构造的范围until:

(0 until 10).random()
Run Code Online (Sandbox Code Playgroud)

如果你正在使用JDK> 1.6,请使用ThreadLocalRandom.current()而不是Random().

KotlinJs和其他变种

对于kotlinjs和其他不允许使用的用例java.util.Random,请参阅此替代方案.

此外,请参阅此答案以了解我的建议的变化.它还包括随机Chars 的扩展功能.

  • 尽管每次调用都返回相同的号码,但它仍然有效 (6认同)
  • `val rnds = (0..10).random()` 实际上生成 0 到 10,包括 __10__ 和 __0__。https://pl.kotl.in/1o8LyD1Dc (2认同)

Mag*_*nus 40

生成from(包含)和to(不包括)之间的随机整数

import java.util.Random

val random = Random()

fun rand(from: Int, to: Int) : Int {
    return random.nextInt(to - from) + from
}
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案不适用于Javascript/Native Kotlin.也许做一个更通用的方法来做这件事可能很酷.:) (3认同)

mut*_*kid 27

从kotlin 1.2开始,你可以写:

(1..3).shuffled().last()

请注意它是大O(n),但对于一个小列表(尤其是唯一值),它没关系:D


mfu*_*n26 10

您可以创建一个扩展函数,类似于一个扩展函数java.util.Random.nextInt(int),IntRange而不是Int为其绑定:

fun Random.nextInt(range: IntRange): Int {
    return range.start + nextInt(range.last - range.start)
}
Run Code Online (Sandbox Code Playgroud)

您现在可以在任何Random实例中使用它:

val random = Random()
println(random.nextInt(5..9)) // prints 5, 6, 7, or 8
Run Code Online (Sandbox Code Playgroud)

如果您不想管理自己的Random实例,那么您可以使用例如以下方法定义便捷方法ThreadLocalRandom.current():

fun rand(range: IntRange): Int {
    return ThreadLocalRandom.current().nextInt(range)
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以像在Ruby中一样获得随机整数,而无需先Random自己声明实例:

rand(5..9) // returns 5, 6, 7, or 8
Run Code Online (Sandbox Code Playgroud)


s1m*_*nw1 9

可能的变化我的随机字符的其他答案

为了获得随机Chars,您可以定义这样的扩展函数

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()
Run Code Online (Sandbox Code Playgroud)

如果你正在使用JDK> 1.6,请使用ThreadLocalRandom.current() 而不是Random().

对于kotlinjs和其他不允许使用的用例java.util.Random,这个答案会有所帮助.

Kotlin> = 1.3多平台支持Random

从1.3开始,Kotlin自带多平台随机发生器.这个KEEP描述了它.您现在可以直接将扩展名作为Kotlin标准库的一部分使用,而无需定义它:

('a'..'b').random()
Run Code Online (Sandbox Code Playgroud)


dev*_*ant 8

在 Kotlin SDK >=1.3 你可以这样做

import kotlin.random.Random

val number = Random.nextInt(limit)
Run Code Online (Sandbox Code Playgroud)


Ste*_*gin 7

建立@ 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
Run Code Online (Sandbox Code Playgroud)

测试用例:

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())
                }
        )
    }
Run Code Online (Sandbox Code Playgroud)


s1m*_*nw1 5

Kotlin >= 1.3,多平台支持 Random

从 1.3 开始,标准库为随机数提供了多平台支持,请参阅答案。

Kotlin < 1.3 在 JavaScript 上

如果您正在使用 Kotlin JavaScript 并且无权访问java.util.Random,则以下内容将起作用:

fun IntRange.random() = (Math.random() * ((endInclusive + 1) - start) + start).toInt()
Run Code Online (Sandbox Code Playgroud)

像这样使用:

// will return an `Int` between 0 and 10 (incl.)
(0..10).random()
Run Code Online (Sandbox Code Playgroud)


And*_*rey 5

在[1,10]范围内随机的例子

val random1 = (0..10).shuffled().last()
Run Code Online (Sandbox Code Playgroud)

或利用Java Random

val random2 = Random().nextInt(10) + 1
Run Code Online (Sandbox Code Playgroud)


Qui*_*inn 5

实现 s1m0nw1 答案的另一种方法是通过变量访问它。并不是说它更有效,但它使您不必键入 ()。

val ClosedRange<Int>.random: Int
    get() = Random().nextInt((endInclusive + 1) - start) +  start 
Run Code Online (Sandbox Code Playgroud)

现在它可以这样访问

(1..10).random
Run Code Online (Sandbox Code Playgroud)


Wil*_*zel 5

不再需要使用自定义扩展函数。IntRange现在有一个random()开箱即用的扩展函数。

val randomNumber = (0..10).random()
Run Code Online (Sandbox Code Playgroud)