Forma idiomática de generar una cadena alfanumérica aleatoria en Kotlin

Puedo generar una secuencia aleatoria de numbers en un range determinado como el siguiente:

fun ClosedRange<Int>.random() = Random().nextInt(endInclusive - start) + start fun generateRandomNumberList(len: Int, low: Int = 0, high: Int = 255): List<Int> { (0..len-1).map { (low..high).random() }.toList() } 

Entonces tendré que extender List con:

 fun List<Char>.random() = this[Random().nextInt(this.size)] 

Entonces puedo hacer:

 fun generateRandomString(len: Int = 15): String{ val alphanumerics = CharArray(26) { it -> (it + 97).toChar() }.toSet() .union(CharArray(9) { it -> (it + 48).toChar() }.toSet()) return (0..len-1).map { alphanumerics.toList().random() }.joinToString("") } 

Pero tal vez hay una mejor manera?

Suponiendo que tiene un set específico de caracteres fuente ( source en este fragment), puede hacer esto:

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

Lo que da cadenas como "LYANFGNPNI" para outputStrLength = 10.

Los dos bits importantes son

  1. Random().ints(length, minValue, maxValue) que produce una secuencia de numbers aleatorios de longitud , cada uno desde minValue hasta maxValue-1 , y
  2. asSequence() que convierte el asSequence() no masivamente útil en una Sequence<Int> mucho más útil.
  • ¿Cómo se puede networkingucir el tamaño del video en el momento de la grabación, Android?
  • Kotlin coroutine traga exception
  • Java Stream con :: nuevo en Kotlin
  • ¿Kotlin no se puede anular valor puede ser nulo?
  • pasando var-args a MessageFormat.format en kotlin
  • Mapeo a less que la exception
  • Invoque RxJava2 cancelable / desechable del hilo correcto
  • Enfrentando problemas con kotlin Dagger 2
  • Parcela: incapaz de calcular el valor
  • Cómo usar lombok con Kapt3
  • RequiresApi vs TargetApi annotations de Android