一个泛型方法,可以返回两个参数之间的随机整数,就像ruby对rand(0..n)所做的那样。
任何建议吗?
一个泛型方法,可以返回两个参数之间的随机整数,就像ruby对rand(0..n)所做的那样。
任何建议吗?
当前回答
我的建议是在IntRange上创建一个扩展函数,像这样创建随机(0..10).random()
TL;DR Kotlin >= 1.3,一个随机的所有平台
在1.3版本中,Kotlin自带多平台随机生成器。在KEEP中有描述。下面描述的扩展现在是Kotlin标准库的一部分,简单地像这样使用它:
val rnds = (0..10).random() // generated random from 0 to 10 included
三
在1.3之前,在JVM上我们使用Random,如果我们在JDK > 1.6上,我们甚至使用ThreadLocalRandom。
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()。
KotlinJs和其他变体
对于kotlinjs和其他不允许使用java.util的用例。随机的,看这个选项。
另外,看看我的建议的变化。它还包括一个用于随机字符的扩展函数。
其他回答
没有标准的方法可以做到这一点,但是您可以使用Math.random()或java.util.Random类轻松创建自己的方法。下面是一个使用Math.random()方法的例子:
fun random(n: Int) = (Math.random() * n).toInt()
fun random(from: Int, to: Int) = (Math.random() * (to - from) + from).toInt()
fun random(pair: Pair<Int, Int>) = random(pair.first, pair.second)
fun main(args: Array<String>) {
val n = 10
val rand1 = random(n)
val rand2 = random(5, n)
val rand3 = random(5 to n)
println(List(10) { random(n) })
println(List(10) { random(5 to n) })
}
这是一个示例输出:
[9, 8, 1, 7, 5, 6, 9, 8, 1, 9]
[5, 8, 9, 7, 6, 6, 8, 6, 7, 9]
在[1,10]范围内的随机示例
val random1 = (0..10).shuffled().last()
或者使用Java Random
val random2 = Random().nextInt(10) + 1
可能的变化,我的其他答案随机字符
为了获得随机字符,可以像这样定义一个扩展函数
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()
从kotlin 1.2开始,您可以这样写:
(1 . . 3) .shuffled () .last ()
只要注意它是大O(n),但对于一个小列表(特别是唯一值),它是可以的:D
你可以创建一个类似于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