Linux中的Swift arc4random_uniform(最大值)
我在Ubuntu中使用Swift,我得到一个错误,arc4random是一个未解析的标识符。有关此已知错误的更多信息。基本上,该函数只存在于BSD发行版中。我曾经尝试过模块映射头文件,apt获取包,但我得到了越来越多的错误,这是不值得追求的,因为这一个函数并不经常使用Linux中的Swift arc4random_uniform(最大值),swift,swift3,ubuntu-16.04,Swift,Swift3,Ubuntu 16.04,我在Ubuntu中使用Swift,我得到一个错误,arc4random是一个未解析的标识符。有关此已知错误的更多信息。基本上,该函数只存在于BSD发行版中。我曾经尝试过模块映射头文件,apt获取包,但我得到了越来越多的错误,这是不值得追求的,因为这一个函数并不经常使用 有没有函数可以获取与Linux中的Swift兼容的带上限参数的伪随机数?您可以尝试类似的方法 #if os(Linux) random() #else arc4random_unifo
有没有函数可以获取与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)))
的调用应该在函数/循环之外,否则,如果使用srandom(UInt32(time(nil)),在函数内生成随机数,它将反复生成相同的值
函数内部每次都可以生成相同的随机数
相反,在main.swift
的顶部准备一次随机种子,然后随机种子在整个过程中应按预期运行
例子:
如果您将srandom
调用放在我的getRandomNum
函数中,Linux上的Swift(在我的例子中是Ubuntu)每次都会产生相同的数字
注意事项:
srandom
和random
不会创建“真正”的随机数,并且在制作可能成为黑客攻击目标的关键任务应用程序时可能会引起安全问题。在这种情况下,唯一真正的解决方案是通过Process()
直接执行Linux的/dev/random
,并使用其结果。但这超出了问题的范围。Swift 4.2
let random = Int.random(in: 0...100)
它在Linux中工作。什么是“做同样的事情”呢?正如您所注意到的,arc4random在Ubuntu上不可用(除非您安装了libbsd包)。还有其他生成(伪)随机数的函数,但它们与arc4random“不同”。@MartinR编辑了我的问题。我想使用一个类似于arc4random_uniform(max)的函数,但我想模偏差对我的使用来说并不重要。我在问题中链接到的arc4random Linux bug可能是@jww的副本,目前还没有解决。另一个问题似乎没有提到解决此问题的任何方法。感谢您的回答,但是arc4random_uniform实际上需要一个max参数,我也是。我发布了我的解决方案。请注意,使用9999,
arc4random_uniform
返回的最大随机数将是9998。您应该使用arc4random\u uniform(10000)
上述代码有偏差,且分布不均匀。@jww正如我在一年前对MartinR的评论中所写,模偏差对我的使用并不重要。然而,如果你能提供一个更好的答案,可能会对其他人有帮助,请随意写一个!上面的代码有偏差,分布不均匀。什么?问题是关于在Ubuntu上运行的Swift代码。“分布不均匀”?它有偏见吗?请详细解释。、、等。这样,您对接受的答案也会有问题,并投票否决。但你没有。我想强调的是,在函数中初始化种子是有问题的。承认你的错误。您提供的解决方案建议使用arc4random
,这在Linux上是不可能的。事实上,在Linux上,目前不可能在Swift中生成一个真正的随机数,因此,对每个答案进行向下投票是错误的,因为它没有做到不可能的事情。
let random = Int.random(in: 0...100)