随机字母数字字符串Linux Swift 3
在Linux中使用Swift 3生成随机字符串时,我遇到了两个问题随机字母数字字符串Linux Swift 3,linux,random,swift3,ubuntu-16.04,vapor,Linux,Random,Swift3,Ubuntu 16.04,Vapor,在Linux中使用Swift 3生成随机字符串时,我遇到了两个问题 arc4random_uniform在Linux中仅在BSD上不可用。所以我可以不用使用random()函数。当我生成一个可变大小的随机数时,这就起作用了(见下面的代码) 为linux修改的代码块 func randomString(_ length: Int) -> String { let letters : String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJ
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
}
func-randomString(u-length:Int)->String
{
let字母:String=“abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz012456789”
让len=letters.characters.count
var randomString=“”
#如果操作系统(Linux)
对于uu0..1)始终使用相同的数字
您必须设置一次种子才能从random()
获取“随机”数:
:
如果未提供种子值,则将使用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
}
func randomString(长度:Int)->String{
let letter letters=“ABCDEFGHIJKLMNOPQRSTUVXYZABCDFGHIJKLMNOPQRSTUVXYZ0123456789”
设len=UInt32(字母.字符.计数)
var randomString=“”
对于uu0..<长度{
设rand=myCustomRandom(len)
设randex=letters.index(letters.startIndex,offsetBy:Int(rand))
让nextChar=字母[randIndex]
随机字符串+=字符串(nextChar)
}
返回随机字符串
}
找到了答案
因此,重复随机数/字符串的答案是在调用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
}
func generateRandomNumber()->Int
{
变量位置=1
var finalNumber=0;
#如果操作系统(Linux)
srand(UInt32(时间(零)))
对于uu0..我复制并粘贴了您的代码,但它无法编译
致命错误:无法从空字符串形成字符
以下是另一种方法:
这对我在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($0) }[rand]
}
let字母:String=“abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzo123456789”
让len=字母数
var randomString:String=“”
对于uu0..<长度{
让rand=Int.random(in:0..感谢您的第一个答案,但是您提供的字母数字字符串部分不支持arc4random_统一,因为它在linux上。当然。您必须使用种子random()
。更新的答案。啊看起来不错。是因为它是swift 4吗?不,这没有使用任何swift 4功能。;)
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
}
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
}
// 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))
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($0) }[rand]
}