在使用Swift 3在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容器,在调用其他函数时,我看到我的服务器在运行和打印。
但问题是,当我在IBMs sandbox中运行该函数时,它实际上是可以工作的。

我假设它也在使用linux。我非常困惑,任何帮助都将是非常感谢的。
(UPDATE):我在linux中运行了相同的函数,其中包含一个单独的快速文件,而不是Vapor快速web框架。而且起作用了。正如我在上面的编辑中提到的,它每次都给我相同的随机字符串。一旦我的构建完成,我仍然需要测试整个项目。但除此之外,我还需要知道随机()函数是否每次都会给我带来一些新的东西,而不是同样的垃圾。
发布于 2017-01-08 08:00:39
弄明白了。
因此,重复的随机数/字符串的答案是在调用随机()函数之前添加这一行
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
} 发布于 2017-01-08 07:57:28
1)总是相同的数字
您必须设置一个种子一次才能从random()获得“随机”数字:
randomSeed(Int(Date().timeIntervalSince1970)手册页
如果不提供种子值,则随机()函数将自动播种,其值为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
}发布于 2017-10-11 17:17:28
我准确地复制和粘贴了您的代码,而它不编译。
致命错误:无法从空字符串中形成字符
以下是另一种方法:
// 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上适用于我。
https://stackoverflow.com/questions/41529854
复制相似问题