java - 如何在Kotlin中获取随机数?
可以在2个参数之间返回随机整数的通用方法,如ruby,可以使用rand(0..n)。
有什么建议吗?
16个解决方案
208 votes
我的建议是IntRange上的扩展函数来创建这样的randoms:Char
Kotlin> = 1.3,对Random的多平台支持
从1.3开始,Kotlin自带多平台随机发生器。 这个KEEP描述了它。 您现在可以执行以下操作(源):
Random.nextInt(0, 10)
因此,扩展功能在所有平台上都如下所示:
fun IntRange.random() = Random.nextInt(start, endInclusive + 1)
Kotlin<1.3
在1.3之前,在JVM上我们使用Char甚至10如果我们使用的是JDK>1.6。
fun IntRange.random() =
Random().nextInt((endInclusive + 1) - start) + start
像这样使用:
// will return an `Int` between 0 and 10 (incl.)
(0..10).random()
如果您希望该函数仅返回Char(不包括10),请使用由Char构造的范围:
(0 until 10).random()
如果你正在使用JDK> 1.6,使用Char而不是Char。
KotlinJs和其他变种
对于kotlinjs和其他不允许使用Char的用例,请参阅此替代方案。
此外,请参阅此答案以了解我的建议的变化。 它还包括随机Chars的扩展功能。
s1m0nw1 answered 2019-06-15T08:51:50Z
37 votes
生成from(含)和to之间的随机整数(不包括)
import java.util.Random
val random = Random()
fun rand(from: Int, to: Int) : Int {
return random.nextInt(to - from) + from
}
Magnus answered 2019-06-15T08:52:18Z
23 votes
从kotlin 1.2开始,你可以写:
(1..3).shuffled().last()
请注意它是大O(n),但对于一个小列表(尤其是唯一值),它没关系:D
mutexkid answered 2019-06-15T08:52:58Z
10 votes
你可以创建一个类似于Random的扩展功能,但是它的绑定需要Random而不是Random:
fun Random.nextInt(range: IntRange): Int {
return range.start + nextInt(range.last - range.start)
}
您现在可以在任何Random实例中使用它:
val random = Random()
println(random.nextInt(5..9)) // prints 5, 6, 7, or 8
如果您不想管理自己的Random实例,则可以使用例如Random定义便捷方法:
fun rand(range: IntRange): Int {
return ThreadLocalRandom.current().nextInt(range)
}
现在,您可以像在Ruby中一样获得随机整数,而无需先自己声明Random实例:
rand(5..9) // returns 5, 6, 7, or 8
mfulton26 answered 2019-06-15T08:53:48Z
8 votes
可能的变化我的随机字符的其他答案
为了得到随机的java.util.Randoms,您可以定义这样的扩展函数
fun ClosedRange.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,使用java.util.Random而不是java.util.Random。
对于kotlinjs和其他不允许使用java.util.Random的用例,这个答案会有所帮助。
Kotlin> = 1.3多平台支持Random
从1.3开始,Kotlin自带多平台随机发生器。 这个KEEP描述了它。 您现在可以执行以下操作(源):
fun ClosedRange.random(): Char = Random.nextInt(start.toInt(), endInclusive.toInt() + 1).toChar()
s1m0nw1 answered 2019-06-15T08:54:46Z
6 votes
建立@ s1m0nw1优秀答案我做了以下更改。
(0..n)意味着在Kotlin中包容
(0到n)意味着在Kotlin独家
对Random实例使用单例对象(可选)
码:
private object RandomRangeSingleton : Random()
fun ClosedRange.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())
}
)
}
Steven Spungin answered 2019-06-15T08:55:47Z
5 votes
在[1,10]范围内随机的例子
val random1 = (0..10).shuffled().last()
或利用Java Random
val random2 = Random().nextInt(10) + 1
Andrey answered 2019-06-15T08:56:21Z
4 votes
如果您使用的是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()
Kotlin> = 1.3多平台支持Random
从1.3开始,Kotlin自带多平台随机发生器。 这个KEEP描述了它。 您现在可以执行以下操作(源):
Random.nextInt(0, 10)
因此,扩展功能可以在所有平台上简化为以下内容:
fun IntRange.random() = Random.nextInt(start, endInclusive + 1)
s1m0nw1 answered 2019-06-15T08:57:04Z
3 votes
实现s1m0nw1的答案的另一种方法是通过变量访问它。 并不是说它更有效,但它可以让你免于输入()。
var ClosedRange.random: Int
get() { return Random().nextInt((endInclusive + 1) - start) + start }
private set(value) {}
现在它可以这样访问
(1..10).random
Quinn answered 2019-06-15T08:57:39Z
2 votes
使用顶级函数,您可以实现与Ruby中完全相同的调用语法(如您所愿):
fun rand(s: Int, e: Int) = Random().nextInt(e + 1 - s) + s
用法:
rand(1, 3) // returns either 1, 2 or 3
Willi Mentzel answered 2019-06-15T08:58:09Z
1 votes
首先,你需要一个RNG。 在Kotlin中,您目前需要使用平台特定的(没有内置的Kotlin)。 对于JVM,它是java.util.Random。您需要创建它的实例,然后调用random.nextInt(n)。
Mibac answered 2019-06-15T08:58:37Z
1 votes
没有标准方法可以执行此操作,但您可以使用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) = random(pair.first, pair.second)
fun main(args: Array) {
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]
Mahdi AlKhalaf answered 2019-06-15T08:59:12Z
1 votes
如果您要选择的数字不是连续的,您可以在List上定义自己的扩展功能:
fun List.randomElement()
= if (this.isEmpty()) null else this[Random().nextInt(this.size)]
用法:
val list = listOf(3, 1, 4, 5)
val number = list.randomElement()
返回列表中的一个数字。
Willi Mentzel answered 2019-06-15T08:59:50Z
1 votes
Kotlin标准库不提供随机数生成器API。 如果您不在多平台项目中,最好使用平台api(问题的所有其他答案都谈论此解决方案)。
但是如果你处于多平台环境中,最好的解决方案是在纯kotlin中自己实现随机,以便在平台之间共享相同的随机数生成器。 开发和测试更简单。
为了在我的个人项目中回答这个问题,我实现了一个纯Kotlin线性同余生成器。 LCG是java.util.Random使用的算法。如果您想使用它,请点击此链接:[https://gist.github.com/11e5ddb567786af0ed1ae4d7f57441d4]
我的实现目的nextInt(range: IntRange)为你;)。
关注我的目的,LCG适用于大多数用例(模拟,游戏等......),但由于此方法的可预测性,因此不适合加密使用。
Valentin Michalak answered 2019-06-15T09:00:51Z
0 votes
在Kotlin 1.3中你可以这样做
val number = Random.nextInt(limit)
deviant answered 2019-06-15T09:01:20Z
-1 votes
超级骗子))
fun rnd_int(min: Int, max: Int): Int {
var max = max
max -= min
return (Math.random() * ++max).toInt() + min
}
Deomin Dmitriy answered 2019-06-15T09:01:49Z