Idiomatic way to generate a random alphanumeric string in Kotlin

Since Kotlin 1.3 you can do this:

fun getRandomString(length: Int) : String {
    val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
    return (1..length)
        .map { allowedChars.random() }
        .joinToString("")
}

Lazy folks would just do

java.util.UUID.randomUUID().toString()

You can not restrict the character range here, but I guess it's fine in many situations anyway.


Assuming you have a specific set of source characters (source in this snippet), you could do this:

val source = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
java.util.Random().ints(outputStrLength, 0, source.length)
        .asSequence()
        .map(source::get)
        .joinToString("")

Which gives strings like "LYANFGNPNI" for outputStrLength = 10.

The two important bits are

  1. Random().ints(length, minValue, maxValue) which produces a stream of length random numbers each from minValue to maxValue-1, and
  2. asSequence() which converts the not-massively-useful IntStream into a much-more-useful Sequence<Int>.

Tags:

Kotlin