随机字母数字stringLinux Swift 3

我有2个问题,当试图用Swift 3在Linux中生成一个随机string。

  1. arc4random_uniform在Linux中仅在BSD上不可用。 所以我能用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 } 

那工作。 编辑:它的作品,但它给我每次相同的数字:(

  1. 当试图生成随机的字母数字string,我只限于使用Swiftstring,而不是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沙箱中运行它时,事情就是这样的function

在这里输入图像描述 我假设它也使用Linux。 我很困扰和困惑,任何帮助将不胜感激。

更新 ):我只用一个swift文件而不是Vapor swift web框架在linux env中运行相同的函数。 它的工作。 正如我在上面的编辑中提到的,它每次都给我一个相同的随机string。 一旦构build完成,我仍然需要testing整个项目。 但除此之外,我需要知道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 } 

1)总是相同的号码

你必须设置一个种子从random()获得“随机”数字:

 randomSeed(Int(Date().timeIntervalSince1970) 

手册页 :

如果没有提供种子值,则random()函数将自动播种,值为1。

由于种子总是相同的(1),你总是会得到相同的“随机”数字序列。

2)字母数字字符串

不使用NSString来创建你的字符串:

 func randomString(length: Int) -> String { let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" let len = UInt32(letters.characters.count) var randomString = "" for _ in 0 ..< length { let rand = myCustomRandom(len) let randIndex = letters.index(letters.startIndex, offsetBy: Int(rand)) let nextChar = letters[randIndex] randomString += String(nextChar) } return randomString } 

我完全复制并粘贴了你的代码,而且不能编译。

致命错误:不能从空字符串形成一个字符

这是另一种方法:

 // Keep at top of your code (outside of functions) #if os(Linux) srandom(UInt32(time(nil))) #endif func getRandomNumber(_ min: Int, _ max: Int) -> Int { #if os(Linux) return Int(random() % max) + min #else return Int(arc4random_uniform(UInt32(max)) + UInt32(min)) #endif } func getRandomString(_ chars: String, _ length: Int) -> String { var str = "" for _ in 1...length { str.append(chars.itemOnStartIndex(advancedBy: getRandomNumber(0, chars.count - 1))) } return str } // Best practice to define this outside of the function itself let chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" print(getRandomString(chars, 10)) 

这在Ubuntu上适用于我。