rand numeros from array aleatorios swift arc4random

numeros - swift random element



Generando números aleatorios con Swift (16)

¡Así es como obtengo un número aleatorio entre 2 int!

func randomNumber(MIN: Int, MAX: Int)-> Int{ var list : [Int] = [] for i in MIN...MAX { list.append(i) } return list[Int(arc4random_uniform(UInt32(list.count)))] }

uso:

print("My Random Number is: /(randomNumber(MIN:-10,MAX:10))")

Necesito generar un número aleatorio.

Parece que la función arc4random ya no existe, así como la función arc4random_uniform .

Las opciones que tengo son arc4random_stir() , arc4random_buf(UnsafeMutablePointer<Void>, Int) y arc4random_addrandom(UnsafeMutablePointer<UInt8>, Int32) .

No puedo encontrar ningún documento sobre las funciones y ningún comentario en los archivos de encabezado da pistas.


¡No olvides que algunos números se repetirán! entonces necesitas hacer algo como ...

Mi total de preguntas fue de 47.

func getRandomNumbers(totalQuestions:Int) -> NSMutableArray { var arrayOfRandomQuestions: [Int] = [] print("arraySizeRequired = 40") print("totalQuestions = /(totalQuestions)") //This will output a 40 random numbers between 0 and totalQuestions (47) while arrayOfRandomQuestions.count < 40 { let limit: UInt32 = UInt32(totalQuestions) let theRandomNumber = (Int(arc4random_uniform(limit))) if arrayOfRandomQuestions.contains(theRandomNumber) { print("ping") } else { //item not found arrayOfRandomQuestions.append(theRandomNumber) } } print("Random Number set = /(arrayOfRandomQuestions)") print("arrayOutputCount = /(arrayOfRandomQuestions.count)") return arrayOfRandomQuestions as! NSMutableArray }


Después de una investigación escribí esto:

import Foundation struct Math { private static var seeded = false static func randomFractional() -> CGFloat { if !Math.seeded { let time = Int(NSDate().timeIntervalSinceReferenceDate) srand48(time) Math.seeded = true } return CGFloat(drand48()) } }

Ahora puede simplemente hacer Math.randomFraction() para obtener números aleatorios [0..1 [sin tener que recordar la inicialización primero. Espero que esto ayude a alguien: o)


En Swift 3:

Generará un número aleatorio entre 0 para limitar

let limit : UInt32 = 6 print("Random Number : /(arc4random_uniform(limit))")


Llego tarde a la fiesta 🤩🎉

El uso de una función que le permite cambiar el tamaño de la matriz y la selección de rango sobre la marcha es el método más versátil. También puede usar el mapa para que sea muy conciso. Lo uso en todas mis pruebas de rendimiento / marcado de banco.

elements es el número de elementos en la matriz
solo incluye números de 0...max

func randArr(_ elements: Int, _ max: Int) -> [Int] { return (0..<elements).map{ _ in Int.random(in: 0...max) } }

El sentido del código / marcadores de posición se ven así randArr(elements: Int, max: Int)

10 elementos en mi matriz que van de 0 a 1000.

randArr(10, 1000) // [554, 8, 54, 87, 10, 33, 349, 888, 2, 77]


Mi implementación como una extensión Int. Generará números aleatorios en el rango from..<to

public extension Int { static func random(from: Int, to: Int) -> Int { guard to > from else { assertionFailure("Can not generate negative random numbers") return 0 } return Int(arc4random_uniform(UInt32(to - from)) + UInt32(from)) } }


Otra opción es usar GKMersenneTwisterRandomSource de GameKit. Los documentos dicen:

Una fuente pseudoaleatoria determinista que genera números aleatorios basados ​​en un algoritmo de mersenne twister. Esta es una fuente aleatoria determinista adecuada para crear mecánicas de juego confiables. Es ligeramente más lento que una fuente Arc4, pero más aleatorio, ya que tiene un período más largo hasta que se repiten las secuencias. Si bien es determinista, esta no es una fuente aleatoria criptográfica. Sin embargo, es adecuado para la ofuscación de los datos del juego.

import GameKit let minValue = 0 let maxValue = 100 var randomDistribution: GKRandomDistribution? let randomSource = GKMersenneTwisterRandomSource() randomDistribution = GKRandomDistribution(randomSource: randomSource, lowestValue: minValue, highestValue: maxValue) let number = randomDistribution?.nextInt() ?? 0 print(number)

Ejemplo tomado del código de muestra de Apple: https://github.com/carekit-apple/CareKit/blob/master/CareKitPrototypingTool/OCKPrototyper/CareKitPatient/RandomNumberGeneratorHelper.swift


Otra opción es usar el algoritmo xorshift128plus :

func xorshift128plus(seed0 : UInt64, _ seed1 : UInt64) -> () -> UInt64 { var state0 : UInt64 = seed0 var state1 : UInt64 = seed1 if state0 == 0 && state1 == 0 { state0 = 1 // both state variables cannot be 0 } func rand() -> UInt64 { var s1 : UInt64 = state0 let s0 : UInt64 = state1 state0 = s0 s1 ^= s1 << 23 s1 ^= s1 >> 17 s1 ^= s0 s1 ^= s0 >> 26 state1 = s1 return UInt64.addWithOverflow(state0, state1).0 } return rand }

Este algoritmo tiene un período de 2 ^ 128 - 1 y pasa todas las pruebas del BigCrush pruebas BigCrush . Tenga en cuenta que si bien este es un generador de números pseudoaleatorios de alta calidad con un período prolongado, no es un generador de números aleatorios criptográficamente seguro .

Puede sembrarlo desde el momento actual o desde cualquier otra fuente aleatoria de entropía. Por ejemplo, si tenía una función llamada urand64() que leía un UInt64 de /dev/urandom , podría usarlo así:

let rand = xorshift128plus(urand64(), urand64()) for _ in 1...10 { print(rand()) }


Permite el código con Swift para el número aleatorio o cadena aleatoria :)

let quotes: NSArray = ["R", "A", "N", "D", "O", "M"] let randomNumber = arc4random_uniform(UInt32(quotes.count)) let quoteString = quotes[Int(randomNumber)] print(quoteString)

le dará salida al azar.


Simplemente llame a esta función y proporcione un rango mínimo y máximo de números y obtendrá un número aleatorio.

por ejemplo, como randomNumber (MIN: 0, MAX: 10) y obtendrá un número entre 0 y 9 .

func randomNumber(MIN: Int, MAX: Int)-> Int{ return Int(arc4random_uniform(UInt32(MAX-MIN)) + UInt32(MIN)); }

Nota: - Siempre obtendrá un número entero de salida.


También podrías intentarlo:

let diceRoll = Int(arc4random_uniform(UInt32(6)))

Tuve que agregar "UInt32" para que funcione.


mira, tuve el mismo problema pero inserto la función como una variable global

como

var RNumber = Int(arc4random_uniform(9)+1) func GetCase(){ your code }

obviamente esto no es eficiente, así que simplemente copie y pegue el código en la función para que pueda ser reutilizable, luego xcode me sugiere configurar la var como constante para que mi código sea

func GetCase() { let RNumber = Int(arc4random_uniform(9)+1) if categoria == 1 { } }

bueno, eso es parte de mi código, así que xcode me dice algo de inmutable e inicialización pero, de todos modos, crea la aplicación y ese consejo simplemente desaparece

Espero eso ayude


puedes usar esto en una tasa específica:

let die = [1, 2, 3, 4, 5, 6] let firstRoll = die[Int(arc4random_uniform(UInt32(die.count)))] let secondRoll = die[Int(arc4random_uniform(UInt32(die.count)))]


===== Swift 4.2 / Xcode 10 =====

let randomIntFrom0To10 = Int.random(in: 1..<10) let randomFloat = Float.random(in: 0..<1) // if you want to get a random element in an array let greetings = ["hey", "hi", "hello", "hola"] greetings.randomElement()

Debajo del capó, Swift usa arc4random_buf para hacer el trabajo.

===== Swift 4.1 / Xcode 9 =====

arc4random() devuelve un número aleatorio en el rango de 0 a 4 294 967 295

drand48() devuelve un número aleatorio en el rango de 0.0 a 1.0

arc4random_uniform(N) devuelve un número aleatorio en el rango de 0 a N - 1

Ejemplos:

arc4random() // => UInt32 = 2739058784 arc4random() // => UInt32 = 2672503239 arc4random() // => UInt32 = 3990537167 arc4random() // => UInt32 = 2516511476 arc4random() // => UInt32 = 3959558840 drand48() // => Double = 0.88642843322303122 drand48() // => Double = 0.015582849408328769 drand48() // => Double = 0.58409022031727176 drand48() // => Double = 0.15936862653180484 drand48() // => Double = 0.38371587480719427 arc4random_uniform(3) // => UInt32 = 0 arc4random_uniform(3) // => UInt32 = 1 arc4random_uniform(3) // => UInt32 = 0 arc4random_uniform(3) // => UInt32 = 1 arc4random_uniform(3) // => UInt32 = 2

arc4random_uniform () se recomienda sobre construcciones como arc4random() % upper_bound ya que evita el "sesgo de módulo" cuando el límite superior no es una potencia de dos.


Actualización con swift 4.2:

let randomInt = Int.random(in: 1..<5) let randomFloat = Float.random(in: 1..<10) let randomDouble = Double.random(in: 1...100) let randomCGFloat = CGFloat.random(in: 1...1000)


let MAX : UInt32 = 9 let MIN : UInt32 = 1 func randomNumber() { var random_number = Int(arc4random_uniform(MAX) + MIN) print ("random = ", random_number); }