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.
  • Kotlin: ¿Cómo puedo crear una function henetworkingable "estática"?
  • Referencia no resuelta para Holdr en Kotlin
  • Kotlin Android comstack
  • Código automático Kotlin llamando en el patrón de delegación
  • RxJava - ¿Entradas de keyboard de contrapresión?
  • ¿Puedo tener dos layouts xml usando el mismo visor usando extensiones sintéticas Kotlin?
  • cómo usar Snackbar.make (ver, Str_Msg, Snackbar.LENGTH_SHORT) en kotlin
  • Kotlin inteligente echó el segundo valor de un par con filter
  • KMango: colección de actualización con col.updateOne / col.updateMany
  • ¿Por qué AtomicInteger es abstracto en Kotlin? (funciona bien en Java)
  • En Kotlin, ¿cómo delegar en una interfaz y proporcionar solo un constructor público sin arguments?