随机字母数字字符串 Linux Swift 3

Random Alphanumeric String Linux Swift 3

我在尝试使用 Swift 3.

在 Linux 中生成 运行dom 字符串时遇到 2 个问题
  1. arc4random_uniform 仅在 BSD 上 Linux 中不可用。所以我能够使用 运行dom() 函数。这在我生成 运行 可变大小的 dom 数字时有效(参见下面的代码)

    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. 尝试生成 运行dom 字母数字字符串时,我只能使用 Swift 字符串而不是 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。我非常困惑和困惑任何帮助将不胜感激。

(UPDATE): 我 运行 在一个 linux env 中有相同的功能,只有一个 swift 文件而不是 Vapor swift 网络框架。它有效。正如我在上面的编辑中提到的,它每次都会给我相同的 运行dom 字符串。构建完成后,我仍然需要测试整个项目。但除此之外,我还需要知道 运行dom() 函数是否真的每次都会给我一些新东西,而不是同样的废话。

1) 总是相同的数字

您必须设置一次种子才能从 random() 中获取 "random" 个数字:

randomSeed(Int(Date().timeIntervalSince1970)

Man page:

If no seed value is provided, the random() function is automatically seeded with a value of 1.

因为种子总是相同的 (1),所以您总是得到相同的 "random" 个数字序列。

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
}

想通了。

所以重复随机 number/string 的答案是在我调用 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
 }  

我完全复制并粘贴了您的代码,但无法编译。

fatal error: Can't form a Character from an empty String

这是另一种方法:

// 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。

Swift 4.2, Ubuntu 16.04

let letters : String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let len = letters.count
var randomString:String = ""
for _ in 0 ..< length {
   let rand = Int.random(in: 0..<len)
   randomString += letters.map { String([=10=]) }[rand]
}