java如何实取随机数_java - 如何在Kotlin中获取随机数?

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

你可能感兴趣的:(java如何实取随机数)