我怎样才能在Kotlin中得到一个随机数字?
一个泛型的方法,可以返回一个随机整数之间的2个参数,如ruby与rand(0..n)
生成from
(包括) to
(独占)之间的随机整数
import java.util.Random val random = Random() fun rand(from: Int, to: Int) : Int { return random.nextInt(to - from) + from }
你会怎么说这个呢,它利用了扩展功能:
fun ClosedRange<Int>.random() = Random().nextInt(endInclusive - start) + start
像这样使用它:
(0..10).random() //will result in Int between 0 and 9
你可以创建一个类似于java.util.Random.nextInt(int)
的扩展函数 ,但是它的绑定需要一个IntRange
而不是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, or 8
如果你不想管理你自己的Random
实例,那么你可以使用例如ThreadLocalRandom.current()
定义一个方便的方法:
fun rand(range: IntRange): Int { return ThreadLocalRandom.current().nextInt(range) }
现在,您可以像在Ruby中一样获得一个随机整数,而无需首先声明一个Random
实例:
rand(5..9) // returns 5, 6, 7, or 8
建立@ 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()) } ) }
首先,你需要一个RNG。 在Kotlin中,您目前需要使用平台特定的平台(没有内置Kotlin)。 对于JVM,它是java.util.Random
。 你需要创建一个实例,然后调用random.nextInt(n)
。
没有这样的标准方法,但是使用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]