我怎样才能在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优秀的答案我做了以下更改。

  1. (0..n)意味着包含在Kotlin中
  2. (0至n)意味着在Kotlin独家
  3. 为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] 
Interesting Posts