首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >随机字母数字字符串Linux 3

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

Stack Overflow用户
提问于 2017-01-08 05:41:58
回答 4查看 886关注 0票数 3

在使用Swift 3在Linux中生成随机字符串时,我遇到了两个问题。

  1. arc4random_uniform在Linux中仅在BSD上不可用。因此,我能够通过使用随机()函数而逃脱惩罚。当我生成一个可变大小的随机数时,这种方法起了作用(参见下面的代码) 函数generateRandomNumber() -> Int { var place =1 var finalNumber = 0;#if os(Linux) for _ in 0..<5 { place *= 10 let randomNumber =Int(随机()% 10) +1 finalNumber += randomNumber * place }# finalNumber _ in 0..<5 { place *= 10 let randomNumber = Int(arc4random_uniform(10)) finalNumber += randomNumber * place } #endif返回finalNumber}

而且这很管用。编辑:,它可以工作,但每次给我相同的号码:

  1. 当尝试生成随机字母数字字符串时,我仅限于使用Swift字符串,而不是NSSTRING。Linux抛出此错误。

原始的预Linux代码块:

代码语言:javascript
复制
   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
    }

以及使用上述代码时所遇到的实际错误。

代码语言:javascript
复制
    error: cannot convert value of type 'NSString' to type 'String' in coercion
        randomString += NSString(characters: &nextChar, length: 1) as String

修改为linux代码块。

代码语言:javascript
复制
    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容器,在调用其他函数时,我看到我的服务器在运行和打印。

但问题是,当我在IBMs sandbox中运行该函数时,它实际上是可以工作的。

我假设它也在使用linux。我非常困惑,任何帮助都将是非常感谢的。

(UPDATE):我在linux中运行了相同的函数,其中包含一个单独的快速文件,而不是Vapor快速web框架。而且起作用了。正如我在上面的编辑中提到的,它每次都给我相同的随机字符串。一旦我的构建完成,我仍然需要测试整个项目。但除此之外,我还需要知道随机()函数是否每次都会给我带来一些新的东西,而不是同样的垃圾。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-01-08 08:00:39

弄明白了。

因此,重复的随机数/字符串的答案是在调用随机()函数之前添加这一行

代码语言:javascript
复制
srand(UInt32(time(nil)))

我想这也是修复非法指令的原因。因为我不记得还有什么改变。

不用说,这是我的最终结果

代码语言:javascript
复制
 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
 }  
票数 3
EN

Stack Overflow用户

发布于 2017-01-08 07:57:28

1)总是相同的数字

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

代码语言:javascript
复制
randomSeed(Int(Date().timeIntervalSince1970)

手册页

如果不提供种子值,则随机()函数将自动播种,其值为1。

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

2)字母数字字符串

不使用NSString创建字符串

代码语言:javascript
复制
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
}
票数 3
EN

Stack Overflow用户

发布于 2017-10-11 17:17:28

我准确地复制和粘贴了您的代码,而它不编译。

致命错误:无法从空字符串中形成字符

以下是另一种方法:

代码语言:javascript
复制
// 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上适用于我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41529854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档