一个泛型方法,可以返回两个参数之间的随机整数,就像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
}

其他回答

使用顶级函数,你可以实现与Ruby中完全相同的调用语法(如你所愿):

fun rand(s: Int, e: Int) = Random.nextInt(s, e + 1)

用法:

rand(1, 3) // returns either 1, 2 or 3

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

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

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

我的建议是在IntRange上创建一个扩展函数,像这样创建随机(0..10).random()

TL;DR Kotlin >= 1.3,一个随机的所有平台

在1.3版本中,Kotlin自带多平台随机生成器。在KEEP中有描述。下面描述的扩展现在是Kotlin标准库的一部分,简单地像这样使用它:

val rnds = (0..10).random() // generated random from 0 to 10 included

在1.3之前,在JVM上我们使用Random,如果我们在JDK > 1.6上,我们甚至使用ThreadLocalRandom。

fun IntRange.random() = 
       Random().nextInt((endInclusive + 1) - start) + start

这样用:

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

如果你想让函数只返回1,2,…, 9(不包括10),使用until构造的范围:

(0 until 10).random()

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

KotlinJs和其他变体

对于kotlinjs和其他不允许使用java.util的用例。随机的,看这个选项。

另外,看看我的建议的变化。它还包括一个用于随机字符的扩展函数。

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

用法:

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

返回列表中的一个数字。

Kotlin标准库不提供随机数生成器API。如果你不是在一个多平台的项目中,最好使用平台api(这个问题的所有其他答案都在谈论这个解决方案)。

但是如果您处于多平台环境中,最好的解决方案是自己在纯kotlin中实现random,以便在平台之间共享相同的随机数生成器。这对于开发和测试来说更加简单。

为了在我的个人项目中解决这个问题,我实现了一个纯Kotlin线性同余生成器。LCG是java.util.Random使用的算法。如果你想使用它,请点击以下链接: https://gist.github.com/11e5ddb567786af0ed1ae4d7f57441d4

我的实现目的nextInt(范围:IntRange)为您;)。

注意我的目的,LCG适用于大多数用例(模拟,游戏等),但不适合密码学使用,因为这种方法的可预测性。