swift swift3 ubuntu-16.04

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.