repetir rango positivos numeros negativos metodo generar arreglo aleatorios random range swift limits

random - positivos - ¿Cuál es la forma más fácil de generar enteros aleatorios dentro de un rango en Swift?



numeros aleatorios negativos y positivos en java (3)

Aquí hay una versión algo más ligera de esto:

func randRange (lower: Int , upper: Int) -> Int { return lower + Int(arc4random_uniform(UInt32(upper - lower + 1))) }

Esto se puede simplificar aún más si decide que esta función funciona solo con valores sin signo:

func randRange (lower: UInt32 , upper: UInt32) -> UInt32 { return lower + arc4random_uniform(upper - lower + 1) }

O, siguiendo la excelente idea de Anton (+1 para usted) de usar un rango como parámetro:

func random(range: Range<UInt32>) -> UInt32 { return range.startIndex + arc4random_uniform(range.endIndex - range.startIndex + 1) }

El método que he ideado hasta ahora es este:

func randRange (lower : Int , upper : Int) -> Int { let difference = upper - lower return Int(Float(rand())/Float(RAND_MAX) * Float(difference + 1)) + lower }

Esto genera enteros aleatorios entre inferior y superior inclusive.


Editado para eliminar el sesgo de módulo según la sugerencia de los comentarios. (¡Gracias!)

Creo que una buena forma de hacer esto puede ser usar el rango de Swift para definir los límites, porque entonces puede especificar 1..100 o 1 ... 100 (incluido o excluyendo el límite superior). Lo mejor que he encontrado hasta ahora es:

import Foundation // needed for rand() func randInRange(range: Range<Int>) -> Int { // arc4random_uniform(_: UInt32) returns UInt32, so it needs explicit type conversion to Int // note that the random number is unsigned so we don''t have to worry that the modulo // operation can have a negative output return Int(arc4random_uniform(UInt32(range.endIndex - range.startIndex))) + range.startIndex } // generate 10 random numbers between -1000 and 999 for _ in 0...100 { randInRange(-1000...1000) }

Intenté usar una extensión en Rango pero parece que no puedes extender el Rango <T donde T: Int> específicamente. Sería aún mejor si pudiera obtener una sintaxis como (1..100) .rand ().


Si estás en extensiones:

extension CountableClosedRange where Bound == Int { var randomValue: Int { return lowerBound + Int(arc4random_uniform(UInt32(upperBound - lowerBound))) } } extension CountableRange where Bound == Int { var randomValue: Int { return lowerBound + Int(arc4random_uniform(UInt32(upperBound - lowerBound))) } } (0...6).randomValue (0..<7).randomValue