Yag*_*ias 122 random jvm kotlin
一种通用方法,可以返回2个参数之间的随机整数,如ruby rand(0..n).
有什么建议吗?
s1m*_*nw1 314
我的建议是一个扩展的功能IntRange创建这样的随机量:(0..10).random()
从1.3开始,Kotlin自带多平台随机发生器.这个KEEP描述了它.下面描述的扩展现在是Kotlin标准库的一部分,只需使用它:
val rnds = (0..10).random()
Run Code Online (Sandbox Code Playgroud)
在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 的扩展功能.
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)
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)
可能的变化我的随机字符的其他答案
为了获得随机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,这个答案会有所帮助.
从1.3开始,Kotlin自带多平台随机发生器.这个KEEP描述了它.您现在可以直接将扩展名作为Kotlin标准库的一部分使用,而无需定义它:
('a'..'b').random()
Run Code Online (Sandbox Code Playgroud)
在 Kotlin SDK >=1.3 你可以这样做
import kotlin.random.Random
val number = Random.nextInt(limit)
Run Code Online (Sandbox Code Playgroud)
建立@ s1m0nw1优秀答案我做了以下更改.
码:
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)
从 1.3 开始,标准库为随机数提供了多平台支持,请参阅此答案。
如果您正在使用 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)
在[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)
实现 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)
不再需要使用自定义扩展函数。IntRange现在有一个random()开箱即用的扩展函数。
val randomNumber = (0..10).random()
Run Code Online (Sandbox Code Playgroud)