一个泛型方法,可以返回两个参数之间的随机整数,就像ruby对rand(0..n)所做的那样。

任何建议吗?


当前回答

Kotlin中的以下内容对我来说效果很好:

(fromNumber.rangeTo(toNumber)).random()

数字的范围以变量fromNumber开始,以变量toNumber结束。fromNumber和toNumber也将包含在由此生成的随机数中。

其他回答

可能的变化,我的其他答案随机字符

为了获得随机字符,可以像这样定义一个扩展函数

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()

如果您使用的是JDK > 1.6,请使用ThreadLocalRandom.current()而不是Random()。

对于kotlinjs和其他不允许使用java.util的用例。随机,这个答案会有帮助。

Kotlin >= 1.3多平台随机支持

在1.3版本中,Kotlin自带多平台随机生成器。在KEEP中有描述。你现在可以直接使用扩展作为Kotlin标准库的一部分,而不需要定义它:

('a'..'b').random()

下面是Kotlin中的一个简单的解决方案,它也适用于KMM:

fun IntRange.rand(): Int =
    Random(Clock.System.now().toEpochMilliseconds()).nextInt(first, last)

对于每次运行的不同随机数需要Seed。您也可以为LongRange做同样的事情。

Kotlin >= 1.3,多平台随机支持

从1.3开始,标准库就为随机提供了多平台支持。

JavaScript上的Kotlin < 1.3

如果您正在使用Kotlin JavaScript,并且无法访问java.util。随机,以下将工作:

fun IntRange.random() = (Math.random() * ((endInclusive + 1) - start) + start).toInt()

这样用:

// will return an `Int` between 0 and 10 (incl.)
(0..10).random()

如果要从中选择的数字不是连续的,则可以使用random()。

用法:

val list = listOf(3, 1, 4, 5)
val number = list.random()

返回列表中的一个数字。

实现s1m0nw1的答案的另一种方法是通过变量访问它。这并不是说它更有效率,而是它使你不必输入()。

val ClosedRange<Int>.random: Int
    get() = Random().nextInt((endInclusive + 1) - start) +  start 

现在它可以被这样访问

(1..10).random