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

任何建议吗?


当前回答

在Kotlin SDK >=1.3中,你可以这样做

import kotlin.random.Random

val number = Random.nextInt(limit)

其他回答

每当有一种情况,你想要生成密钥或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 SDK >=1.3中,你可以这样做

import kotlin.random.Random

val number = Random.nextInt(limit)

我的建议是在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的用例。随机的,看这个选项。

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

不再需要使用自定义扩展函数。IntRange现在有一个即用的random()扩展函数。

val randomNumber = (0..10).random()

完整的源代码。可以控制是否允许复制。

import kotlin.math.min

abstract class Random {

    companion object {
        fun string(length: Int, isUnique: Boolean = false): String {
            if (0 == length) return ""
            val alphabet: List<Char> = ('a'..'z') + ('A'..'Z') + ('0'..'9') // Add your set here.

            if (isUnique) {
                val limit = min(length, alphabet.count())
                val set = mutableSetOf<Char>()
                do { set.add(alphabet.random()) } while (set.count() != limit)
                return set.joinToString("")
            }
            return List(length) { alphabet.random() }.joinToString("")
        }

        fun alphabet(length: Int, isUnique: Boolean = false): String {
            if (0 == length) return ""
            val alphabet = ('A'..'Z')
            if (isUnique) {
                val limit = min(length, alphabet.count())
                val set = mutableSetOf<Char>()
                do { set.add(alphabet.random()) } while (set.count() != limit)
                return set.joinToString("")
            }

            return List(length) { alphabet.random() }.joinToString("")
        }
    }
}