Saltar al contenido

Generar un número aleatorio de cierta cantidad de dígitos

Te damos el hallazgo a esta contratiempo, al menos eso esperamos. Si continuas con inquietudes dínoslo, que sin dudarlo te ayudaremos

Solución:

Paso 1

En primer lugar, necesitamos una extensión de Int para generar un número aleatorio en un rango.

extension Int 
    init(_ range: Range ) 
        let delta = range.startIndex < 0 ? abs(range.startIndex) : 0
        let min = UInt32(range.startIndex + delta)
        let max = UInt32(range.endIndex   + delta)
        self.init(Int(min + arc4random_uniform(max - min)) - delta)
    

Esto se puede utilizar de esta manera:

Int(0...9) // 4 or 1 or 1...
Int(10...99) // 90 or 33 or 11
Int(100...999) // 200 or 333 or 893

Paso 2

Ahora necesitamos una función que reciba el número de dígitos solicitados, calcule el rango del número aleatorio y finalmente invoque el nuevo inicializador de Int.

func random(digits:Int) -> Int 
    let min = Int(pow(Double(10), Double(digits-1))) - 1
    let max = Int(pow(Double(10), Double(digits))) - 1
    return Int(min...max)

Prueba

random(1) // 8
random(2) // 12
random(3) // 829
random(4) // 2374

Swift 5: solución sencilla

func random(digits:Int) -> String 
    var number = String()
    for _ in 1...digits 
       number += "(Int.random(in: 1...9))"
    
    return number


print(random(digits: 1)) //3
print(random(digits: 2)) //59
print(random(digits: 3)) //926

Nota Devolverá valor en Stringsi necesitas Int valor entonces puedes hacer esto

let number = Int(random(digits: 1)) ?? 0

Aquí hay un pseudocódigo que debería hacer lo que quieras.

generateRandomNumber(20)
func generateRandomNumber(int numDigits)
   var place = 1
   var finalNumber = 0;
   for(int i = 0; i < numDigits; i++)
      place *= 10
      var randomNumber = arc4random_uniform(10)
      finalNumber += randomNumber * place
  
  return finalNumber

Es bastante simple. Generas 20 números aleatorios, y los multiplicas por las respectivas decenas, centésimas, millares... lugar en el que deben estar. De esta forma garantizarás un número del tamaño correcto, pero generarás aleatoriamente el número que se usará en cada lugar.

Actualizar

Como se dijo en los comentarios, lo más probable es que obtenga una excepción de desbordamiento con un número tan largo, por lo que tendrá que ser creativo en la forma en que le gustaría almacenar el número (String, ect...) pero simplemente quería mostrarle una forma sencilla de generar un número con una longitud de dígito garantizada. Además, dado el código actual, existe una pequeña posibilidad de que su número inicial sea 0, por lo que también debe protegerse contra eso.

Reseñas y valoraciones

Si conservas alguna vacilación y capacidad de acrecentar nuestro escrito eres capaz de escribir una interpretación y con placer lo ojearemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *