Идиоматический способ генерации случайной буквенно-цифровой строки в Котлине

Я могу создать случайную последовательность чисел в определенном диапазоне, например:

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

Тогда мне придется расширить List с:

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

Тогда я могу сделать:

 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("") } образом 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("") } 

Но, может быть, есть лучший способ?

Предполагая, что у вас есть определенный набор исходных символов ( source в этом фрагменте), вы можете сделать это:

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

Что дает строки типа «LYANFGNPNI» для outputStrLength = 10.

Два важных бита:

  1. Random().ints(length, minValue, maxValue) который производит поток случайных чисел длины от minValue до maxValue-1 и
  2. asSequence() которая преобразует не-массово полезный IntStream в гораздо более полезную Sequence<Int> .
Intereting Posts
Факториал с использованием цикла `for` в Котлине Есть ли способ сделать BigDecimal быстрее, чем здесь? Отправка большого файла через BLE API на Android Kotlin – Почему эта функция не подходит для рекурсии хвоста? Joda DateTime Timezone не отображается правильно Kotlin: зачем использовать абстрактные классы (vs. интерфейсы)? Закрыть / Скрыть SoftinputKeyboard в kotlin Внедрение интерфейса анонимно в Kotlin приводит к ошибке «не имеет конструкторов» Android Retrofit Получить запрос в кодировке Как вручную подключить Kotlin fun с помощью <reified T: Any> Как смешивать несколько конструкторов родительского класса с val в дочернем классе Пользовательский сериализатор Джексона или объект ценности? Котлинские аннотации о делегированных свойствах Android Dagger: я не могу предоставить внешний класс без конструктора @Inject Объявление функциональных литералов с типичными входными параметрами в Котлине