随机字母数字字符串Linux Swift 3
|
尝试使用
Swift 3在
Linux中生成随机字符串时遇到2个问题.
> arc4random_uniform仅在BSD上的Linux中不可用.所以我能够使用random()函数逃脱.这在我生成可变大小的随机数时起作用(参见下面的代码) func generateRandomNumber() -> Int
{
var place = 1
var finalNumber = 0;
#if os(Linux)
for _ in 0..<5
{
place *= 10
let randomNumber = Int(random() % 10) + 1
finalNumber += randomNumber * place
}
#else
for _ in 0..<5
{
place *= 10
let randomNumber = Int(arc4random_uniform(10))
finalNumber += randomNumber * place
}
#endif
return finalNumber
}
那个工作. >当尝试生成随机字母数字字符串时,我仅限于使用Swift String而不是NSSTRING. Linux抛出此错误 原始的Linux前代码块: func randomString(_ length: Int) -> String
{
let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let len = UInt32(letters.length)
var randomString = ""
for _ in 0 ..< length {
let rand = arc4random_uniform(len)
var nextChar = letters.character(at: Int(rand))
randomString += NSString(characters: &nextChar,length: 1) as String
}
return randomString
}
以及使用上面代码时得到的实际错误 error: cannot convert value of type 'NSString' to type 'String' in coercion
randomString += NSString(characters: &nextChar,length: 1) as String
修改为linux代码块. func randomString(_ length: Int) -> String
{
let letters : String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let len = letters.characters.count
var randomString = ""
#if os(Linux)
for _ in 0..<length
{
let randomValue = (random() % len) + 1
randomString += "(letters[letters.index(letters.startIndex,offsetBy: Int(randomValue))])"
}
#else
for _ in 0 ..< length
{
let rand = arc4random_uniform(UInt32(len))
randomString += "(letters[letters.index(letters.startIndex,offsetBy: Int(rand))])"
}
#endif
return randomString
}
但这次错误很奇怪,它只是说没有额外信息的非法指令.我以交互模式运行了docker容器,我看到我的服务器正在运行并在调用其他函数时打印出来等. 但事实上,当我在IBM的swift中运行它时,函数实际上是可行的
我也假设它也使用linux.我非常困惑和困惑任何帮助将不胜感激. (更新):我在一个linux env中使用单个swift文件而不是Vapor swift web框架运行相同的功能.它的工作原理.正如我在上面的编辑中所提到的,它每次都给我相同的随机字符串.一旦我的构建完成,我仍然需要测试整个项目.但除此之外,我需要知道random()函数是否实际上每次给我一些新东西而不是相同的废话. 解决方法
弄清楚了.
所以重复随机数/字符串的答案就是在调用random()函数之前添加这一行 srand(UInt32(time(nil))) 我假设那也是修正非法指令的原因.因为我不记得改变其他任何东西. 不用说这是我的最终结果 func generateRandomNumber() -> Int
{
var place = 1
var finalNumber = 0;
#if os(Linux)
srand(UInt32(time(nil)))
for _ in 0..<5
{
place *= 10
let randomNumber = Int(random() % 10) + 1
finalNumber += randomNumber * place
}
#else
for _ in 0..<5
{
place *= 10
let randomNumber = Int(arc4random_uniform(10))
finalNumber += randomNumber * place
}
#endif
return finalNumber
}
func randomString(_ length: Int) -> String
{
let letters : String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let len = letters.characters.count
var randomString = ""
#if os(Linux)
srand(UInt32(time(nil)))
for _ in 0..<length
{
let randomValue = (random() % len) + 1
randomString += "(letters[letters.index(letters.startIndex,offsetBy: Int(randomValue))])"
}
#else
for _ in 0 ..< length
{
let rand = arc4random_uniform(UInt32(len))
randomString += "(letters[letters.index(letters.startIndex,offsetBy: Int(rand))])"
}
#endif
return randomString
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

