如何在 Kotlin 中获取随机数?

304

有一种通用的方法可以返回两个参数之间的随机整数,就像 Ruby 中使用 rand(0..n) 一样。

有什么建议吗?

25个回答

5

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

从1.3版本开始,标准库提供了多平台支持的随机数功能,详情请参见此回答

Kotlin < 1.3 在 JavaScript 上的处理

如果你在使用 Kotlin JavaScript,并且没有访问java.util.Random的权限,可以使用以下方法:

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

使用方法如下:

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

4
如果您想要选择的数字不是连续的,您可以使用 random()
用法:
val list = listOf(3, 1, 4, 5)
val number = list.random()

返回列表中的一个数字。

3
使用顶层函数,您可以实现与 Ruby 中完全相同的调用语法(如您所愿):
fun rand(s: Int, e: Int) = Random.nextInt(s, e + 1)

使用方法:

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

2
Kotlin标准库不提供随机数生成器API。如果您不在多平台项目中,最好使用平台API(问题的所有其他答案都谈到了这个解决方案)。
但是,如果您处于多平台上下文中,则最佳解决方案是在纯Kotlin中自己实现随机数生成器,以便在平台之间共享相同的随机数生成器。这对于开发和测试来说更简单。
为了解决我的个人项目中的这个问题,我实现了一个纯Kotlin 线性同余生成器。LCG是java.util.Random使用的算法。如果您想使用它,请跟随此链接: https://gist.github.com/11e5ddb567786af0ed1ae4d7f57441d4 我的实现目的是为您提供nextInt(range: IntRange)
请注意我的目的,LCG对大多数用例(模拟、游戏等)很好,但由于该方法的可预测性,在加密方面不适合使用。

我宁愿依赖于特定平台的代码,也不想自己编写随机算法。这让我想起了java.util.Random的代码,但并不完全匹配。 - Simon Forsberg

2
从随机数生成器中获取下一个随机整数。
Random.nextInt()

2

目前还没有标准方法可以实现这个功能,但您可以使用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]

1
首先,您需要一个随机数生成器。在 Kotlin 中,您目前需要使用特定于平台的生成器(Kotlin 没有内置的生成器)。对于 JVM,它是 java.util.Random。您需要创建其实例,然后调用 random.nextInt(n)

1
要在Kotlin中获取随机整数,请使用以下方法:
import java.util.concurrent.ThreadLocalRandom

fun randomInt(rangeFirstNum:Int, rangeLastNum:Int) {
    val randomInteger = ThreadLocalRandom.current().nextInt(rangeFirstNum,rangeLastNum)
    println(randomInteger)
}
fun main() {    
    randomInt(1,10)
}


// Result – random Int numbers from 1 to 9

希望这有所帮助。

1

以下的 Kotlin 代码对我很有效:

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

数字范围从变量fromNumber开始,以变量toNumber结束。在此范围内生成的随机数将包括fromNumbertoNumber

0

这里有一个简单的 Kotlin 解决方案,也适用于 KMM:

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

种子在每次运行时需要不同的随机数。您也可以对LongRange执行相同的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接