一个泛型方法,可以返回两个参数之间的随机整数,就像ruby对rand(0..n)所做的那样。

任何建议吗?


当前回答

你可以创建一个类似于java.util.Random.nextInt(int)的扩展函数,但它的边界是一个inrange而不是int:

fun Random.nextInt(range: IntRange): Int {
    return range.start + nextInt(range.last - range.start)
}

你现在可以对任何随机实例使用这个:

val random = Random()
println(random.nextInt(5..9)) // prints 5, 6, 7, 8, or 9

如果你不想管理自己的随机实例,那么你可以定义一个方便的方法,例如使用ThreadLocalRandom.current():

fun rand(range: IntRange): Int {
    return ThreadLocalRandom.current().nextInt(range)
}

现在你可以像在Ruby中一样获得一个随机整数,而不需要自己首先声明一个随机实例:

rand(5..9) // returns 5, 6, 7, 8, or 9

其他回答

从kotlin 1.2开始,您可以这样写:

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

只要注意它是大O(n),但对于一个小列表(特别是唯一值),它是可以的:D

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

为了获得随机字符,可以像这样定义一个扩展函数

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的用例。随机,这个答案会有帮助。

Kotlin >= 1.3多平台随机支持

在1.3版本中,Kotlin自带多平台随机生成器。在KEEP中有描述。你现在可以直接使用扩展作为Kotlin标准库的一部分,而不需要定义它:

('a'..'b').random()

从随机数生成器获取下一个随机Int。

Random.nextInt()

在from(含)和to(不含)之间生成一个随机整数

import java.util.Random

val random = Random()

fun rand(from: Int, to: Int) : Int {
    return random.nextInt(to - from) + from
}

如果要从中选择的数字不是连续的,则可以使用random()。

用法:

val list = listOf(3, 1, 4, 5)
val number = list.random()

返回列表中的一个数字。