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

任何建议吗?


当前回答

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

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

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

其他回答

每当有一种情况,你想要生成密钥或mac地址,这是基于用户需求的十六进制数字,这也是使用android和kotlin,然后你我下面的代码帮助你:

private fun getRandomHexString(random: SecureRandom, numOfCharsToBePresentInTheHexString: Int): String {
    val sb = StringBuilder()
    while (sb.length < numOfCharsToBePresentInTheHexString) {
        val randomNumber = random.nextInt()
        val number = String.format("%08X", randomNumber)
        sb.append(number)
    }
    return sb.toString()
} 

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

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

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

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

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

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

基于@s1m0nw1的优秀答案,我做了以下更改。

(0..n)在Kotlin中表示包含 (0到n)在Kotlin中表示独占 为Random实例使用单例对象(可选)

代码:

private object RandomRangeSingleton : Random()

fun ClosedRange<Int>.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())
                }
        )
    }

从kotlin 1.2开始,您可以这样写:

(1 . . 3) .shuffled () .last ()

只要注意它是大O(n),但对于一个小列表(特别是唯一值),它是可以的:D