一个泛型方法,可以返回两个参数之间的随机整数,就像ruby对rand(0..n)所做的那样。
任何建议吗?
一个泛型方法,可以返回两个参数之间的随机整数,就像ruby对rand(0..n)所做的那样。
任何建议吗?
当前回答
要在Kotlin中获得一个随机Int数,请使用以下方法:
import java.util.concurrent.ThreadLocalRandom
fun randomInt(rangeFirstNum:Int, rangeLastNum:Int) {
val randomInteger = ThreadLocalRandom.current().nextInt(rangeFirstNum,rangeLastNum)
println(randomInteger)
}
fun main() {
randomInt(1,10)
}
// Result – random Int numbers from 1 to 9
希望这能有所帮助。
其他回答
你可以创建一个类似于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标准库不提供随机数生成器API。如果你不是在一个多平台的项目中,最好使用平台api(这个问题的所有其他答案都在谈论这个解决方案)。
但是如果您处于多平台环境中,最好的解决方案是自己在纯kotlin中实现random,以便在平台之间共享相同的随机数生成器。这对于开发和测试来说更加简单。
为了在我的个人项目中解决这个问题,我实现了一个纯Kotlin线性同余生成器。LCG是java.util.Random使用的算法。如果你想使用它,请点击以下链接: https://gist.github.com/11e5ddb567786af0ed1ae4d7f57441d4
我的实现目的nextInt(范围:IntRange)为您;)。
注意我的目的,LCG适用于大多数用例(模拟,游戏等),但不适合密码学使用,因为这种方法的可预测性。
不再需要使用自定义扩展函数。IntRange现在有一个即用的random()扩展函数。
val randomNumber = (0..10).random()
基于@s1m0nw1的优秀答案,我做了以下更改。
(0..n)在Kotlin中表示包含 (0到n)在Kotlin中表示独占 为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())
}
)
}
Kotlin中的以下内容对我来说效果很好:
(fromNumber.rangeTo(toNumber)).random()
数字的范围以变量fromNumber开始,以变量toNumber结束。fromNumber和toNumber也将包含在由此生成的随机数中。