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 String
si 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.