Swift arc4random_uniform(最大)在 Linux
Swift arc4random_uniform(max) in Linux
我在 Ubuntu 中使用 Swift,我收到一条错误消息,指出 arc4random 是一个未解析的标识符。有关此已知错误 here 的更多信息。基本上,该功能只存在于 BSD 发行版中。试过模块映射头文件,apt-getting包,错误越来越多,这个功能用得不多,不值得追
在Linux中是否有任何函数可以获取上限参数与Swift兼容的伪随机数?
你可以尝试这样的事情吗?
#if os(Linux)
random()
#else
arc4random_uniform()
#endif
对于 4 位随机数,我使用了类似这样的方法:
#if os(Linux)
srandom(UInt32(time(nil)))
randomString = String(format: "%04d", UInt32(random() % 10000))
#else
randomString = String(format: "%04d", Int(arc4random_uniform(10000)))
#endif
编辑:注意对srandom(UInt32(time(nil)))
的调用应该在function/loop之外,否则会一遍又一遍地产生相同的值
如果在函数中生成随机数,在函数中使用srandom(UInt32(time(nil)))
可以生成相同的随机数时间。
相反,在 main.swift
的顶部准备随机种子一次,然后随机应始终按预期运行。
示例:
//
// 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 on Linux(在我的例子中是 Ubuntu)如果你把 srandom
调用放在我的 getRandomNum
中,每次都会产生相同的数字功能。
注意事项:
srandom
和 random
不会创建 "truly" 随机数,并且在制作可能成为黑客攻击目标的关键任务应用程序时可能会成为安全问题。在这种情况下,唯一真正的解决方案是直接通过 Process()
执行 Linux 的 /dev/random
,并使用其结果。但这不在问题范围内。
Swift 4.2
let random = Int.random(in: 0...100)
https://developer.apple.com/documentation/swift/int/2995648-random
PS。它适用于 Linux.
我在 Ubuntu 中使用 Swift,我收到一条错误消息,指出 arc4random 是一个未解析的标识符。有关此已知错误 here 的更多信息。基本上,该功能只存在于 BSD 发行版中。试过模块映射头文件,apt-getting包,错误越来越多,这个功能用得不多,不值得追
在Linux中是否有任何函数可以获取上限参数与Swift兼容的伪随机数?
你可以尝试这样的事情吗?
#if os(Linux)
random()
#else
arc4random_uniform()
#endif
对于 4 位随机数,我使用了类似这样的方法:
#if os(Linux)
srandom(UInt32(time(nil)))
randomString = String(format: "%04d", UInt32(random() % 10000))
#else
randomString = String(format: "%04d", Int(arc4random_uniform(10000)))
#endif
编辑:注意对srandom(UInt32(time(nil)))
的调用应该在function/loop之外,否则会一遍又一遍地产生相同的值
如果在函数中生成随机数,在函数中使用srandom(UInt32(time(nil)))
可以生成相同的随机数时间。
相反,在 main.swift
的顶部准备随机种子一次,然后随机应始终按预期运行。
示例:
//
// 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 on Linux(在我的例子中是 Ubuntu)如果你把 srandom
调用放在我的 getRandomNum
中,每次都会产生相同的数字功能。
注意事项:
srandom
和 random
不会创建 "truly" 随机数,并且在制作可能成为黑客攻击目标的关键任务应用程序时可能会成为安全问题。在这种情况下,唯一真正的解决方案是直接通过 Process()
执行 Linux 的 /dev/random
,并使用其结果。但这不在问题范围内。
Swift 4.2
let random = Int.random(in: 0...100)
https://developer.apple.com/documentation/swift/int/2995648-random
PS。它适用于 Linux.