How to generate N random integers, each with distinct digits and exact length L in Kotlin

1 Answer

0 votes
import kotlin.random.Random
import kotlin.math.pow  // Needed for Double.pow

// Helper extension function for integer power
// Uses Double.pow under the hood, then converts back to Int
fun Int.pow(exp: Int): Int {
    return this.toDouble().pow(exp).toInt()
}

// Generates N random integers, each with distinct digits and exact length L
fun generateDistinctDigitNumbers(N: Int, L: Int): List<Int> {
    require(L > 0) { "Length L must be positive" }

    val results = mutableSetOf<Int>() // Use a set to avoid duplicate numbers

    // Lower bound: smallest L-digit number (e.g., L=3 -> 100)
    val lower = 10.pow(L - 1)
    // Upper bound: first number with more than L digits (exclusive) (e.g., L=3 -> 1000)
    val upper = 10.pow(L)

    while (results.size < N) {
        // Generate a random L-digit number
        val number = Random.nextInt(from = lower, until = upper)

        // Convert number to string to check digit uniqueness
        val digits = number.toString()

        // Check if all digits are distinct
        if (digits.toSet().size == digits.length) {
            results.add(number)
        }
    }

    return results.toList()
}

fun main() {
    val numbers = generateDistinctDigitNumbers(N = 10, L = 6)
    println(numbers)
}



/*
run:

[287530, 197486, 218549, 420617, 563189, 418709, 125406, 725069, 169482, 529764]

*/

 



answered Jul 16 by avibootz

Related questions

...