Tyr*_*ess 12 swift swift3 ubuntu-16.04
我在Ubuntu中使用Swift,我收到一个错误,arc4random是一个未解析的标识符.在这个已知的错误的详细信息在这里.基本上,该功能仅存在于BSD发行版中.我已经尝试过模块映射头文件,apt-getting包,并且我得到越来越多的错误,这是不值得追求的,因为这个函数不经常使用.
是否有任何函数可以获取具有与Linux中的Swift兼容的上限参数的伪随机数?
斯威夫特4.2
let random = Int.random(in: 0...100)
Run Code Online (Sandbox Code Playgroud)
https://developer.apple.com/documentation/swift/int/2995648-random
PS。它适用于Linux。
我对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
Run Code Online (Sandbox Code Playgroud)
编辑:请注意,对的调用srandom(UInt32(time(nil)))应在函数/循环之外,否则将一遍又一遍地产生相同的值
如果在函数内生成随机数,则在函数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))
Run Code Online (Sandbox Code Playgroud)
如果你把srandom调用放在我的getRandomNum函数中,那么Linux上的Swift(在我的情况下是Ubuntu)每次都会生成相同的数字.
srandom并且random不要创建"真正的"随机数,并且在制作可能成为攻击目标的关键任务应用程序时可能会成为安全问题.在这种情况下唯一真正的解决方案是/dev/random直接执行Linux Process(),并使用其结果.但这超出了问题的范围.
| 归档时间: |
|
| 查看次数: |
3116 次 |
| 最近记录: |