一个泛型方法,可以返回两个参数之间的随机整数,就像ruby对rand(0..n)所做的那样。
任何建议吗?
一个泛型方法,可以返回两个参数之间的随机整数,就像ruby对rand(0..n)所做的那样。
任何建议吗?
当前回答
Kotlin标准库不提供随机数生成器API。如果你不是在一个多平台的项目中,最好使用平台api(这个问题的所有其他答案都在谈论这个解决方案)。
但是如果您处于多平台环境中,最好的解决方案是自己在纯kotlin中实现random,以便在平台之间共享相同的随机数生成器。这对于开发和测试来说更加简单。
为了在我的个人项目中解决这个问题,我实现了一个纯Kotlin线性同余生成器。LCG是java.util.Random使用的算法。如果你想使用它,请点击以下链接: https://gist.github.com/11e5ddb567786af0ed1ae4d7f57441d4
我的实现目的nextInt(范围:IntRange)为您;)。
注意我的目的,LCG适用于大多数用例(模拟,游戏等),但不适合密码学使用,因为这种方法的可预测性。
其他回答
从随机数生成器获取下一个随机Int。
Random.nextInt()
在[1,10]范围内的随机示例
val random1 = (0..10).shuffled().last()
或者使用Java Random
val random2 = Random().nextInt(10) + 1
使用顶级函数,你可以实现与Ruby中完全相同的调用语法(如你所愿):
fun rand(s: Int, e: Int) = Random.nextInt(s, e + 1)
用法:
rand(1, 3) // returns either 1, 2 or 3
完整的源代码。可以控制是否允许复制。
import kotlin.math.min
abstract class Random {
companion object {
fun string(length: Int, isUnique: Boolean = false): String {
if (0 == length) return ""
val alphabet: List<Char> = ('a'..'z') + ('A'..'Z') + ('0'..'9') // Add your set here.
if (isUnique) {
val limit = min(length, alphabet.count())
val set = mutableSetOf<Char>()
do { set.add(alphabet.random()) } while (set.count() != limit)
return set.joinToString("")
}
return List(length) { alphabet.random() }.joinToString("")
}
fun alphabet(length: Int, isUnique: Boolean = false): String {
if (0 == length) return ""
val alphabet = ('A'..'Z')
if (isUnique) {
val limit = min(length, alphabet.count())
val set = mutableSetOf<Char>()
do { set.add(alphabet.random()) } while (set.count() != limit)
return set.joinToString("")
}
return List(length) { alphabet.random() }.joinToString("")
}
}
}
首先,您需要一个RNG。在Kotlin中,您目前需要使用特定于平台的工具(没有内置的Kotlin)。对于JVM,它是java.util.Random。你需要创建它的一个实例,然后调用random.nextInt(n)。