Swift arc4random_uniform(max) en Linux
swift3 ubuntu-16.04 (3)
Fui con algo como esto para números aleatorios de 4 dígitos:
#if os(Linux)
srandom(UInt32(time(nil)))
randomString = String(format: "%04d", UInt32(random() % 10000))
#else
randomString = String(format: "%04d", Int(arc4random_uniform(9999)))
#endif
Editar: Tenga en cuenta que la llamada a srandom(UInt32(time(nil)))
debe estar fuera de una función / loop, de lo contrario producirá el mismo valor una y otra vez
Estoy trabajando con Swift en Ubuntu, y estoy recibiendo un error que arc4random es un identificador no resuelto. Más información sobre este error conocido aquí . Básicamente, la función solo existe en las distribuciones de BSD. He intentado con los archivos de encabezado de asignación de módulos, con los paquetes de obtención de apt, y recibo cada vez más errores, lo cual no vale la pena, ya que esta función no se usa con mucha frecuencia.
¿Hay alguna función para obtener números pseudoaleatorios con un parámetro de límite superior que sea compatible con Swift en Linux?
Podrías probar algo como esto?
#if os(Linux)
random()
#else
arc4random_uniform()
#endif
Si se genera un número aleatorio dentro de una función , el uso de srandom(UInt32(time(nil)))
dentro de la función puede producir el mismo número aleatorio cada vez.
En su lugar, prepare la semilla al azar en la parte superior de su main.swift
una vez, y luego al azar debe comportarse como se espera en todo momento.
Ejemplo:
//
// main.swift
// Top of your code
//
import Foundation
#if os(Linux)
srandom(UInt32(time(nil)))
#endif
func getRandomNum(_ min: Int, _ max: Int) -> Int {
#if os(Linux)
return Int(random() % max) + min
#else
return Int(arc4random_uniform(UInt32(max)) + UInt32(min))
#endif
}
// Print random numbers between 1 and 10
print(getRandomNum(1, 10))
print(getRandomNum(1, 10))
print(getRandomNum(1, 10))
print(getRandomNum(1, 10))
print(getRandomNum(1, 10))
Swift en Linux (Ubuntu en mi caso) producirá el mismo número cada vez si coloca la llamada srandom
dentro de mi función getRandomNum
.
Nota de precaución:
srandom
y random
no crean un número "verdaderamente" aleatorio, y pueden ser un problema de seguridad cuando se hacen aplicaciones de misión crítica que serían un objetivo de un hack. La única solución real en ese caso es ejecutar Linux /dev/random
directamente a través de Process()
, y usar su resultado. Pero esto está fuera del alcance de la pregunta.